多输出多分类Keras模型

7

对于每个输入,我都有一个关联的49x2矩阵。以下是1个输入输出对的示例:

input :
[Car1, Car2, Car3 ..., Car118]

output :
[[Label1 Label2]
 [Label1 Label2]
      ...
 [Label1 Label2]]

在这里,Label1和Label2都是经过LabelEncode处理的,它们分别有1200个和1300个不同的类。

只是为了确保这就是我们所说的多输出多类问题吗?

我试图扁平化输出,但我担心模型无法理解所有相似的标签共享相同的类别。

是否有一个Keras层来处理这种特殊的数组形状的输出呢?

1个回答

4
一般来说,多类问题对应的模型会输出一个概率分布,覆盖全部类别(通常通过交叉熵与实际类别的one-hot编码进行比较)。不管你是将其构建为一个单一输出、两个输出、49个输出还是49 x 2 = 98个输出,这意味着需要有1,200 x 49 + 1,300 x 49 = 122,500个输出单元。虽然计算机可以处理这些,但这可能不是最方便的方法。你可以尝试将每个类别的输出设置为一个单独的(例如线性)单元,并将其值四舍五入以选择标签,但除非标签具有某些数值意义(例如顺序、大小等),否则这不太可能奏效。
如果输入元素的顺序具有某种意义(即,重新排列会影响输出),我认为我会通过RNN来解决问题,比如使用LSTM或双向LSTM模型,并使用两个输出。对于输出,使用return_sequences=TrueTimeDistributed Dense softmax层,并且对于每个长度为118的输入,您将拥有118对输出;然后,您可以使用时序样本加权来删除前69个(或者如果您使用的是双向模型,可以尝试删除前35个和最后34个),并使用剩余的49对标签计算损失。或者,如果这对您的数据有意义(也许没有),您可以选择更高级的方法,例如CTC(虽然Keras没有它,但我正在尝试将TensorFlow实现集成到其中,但没有太大的成功),该方法也在Keras中实现(感谢@indraforyou!)。
如果输入的顺序没有意义,但输出的顺序有意义,则您可以使用RNN,其中输入是原始的118长向量加上一对标签(每个标签都是独热编码),输出再次是一对标签(又是两个softmax层)。想法是在每个帧上获得49x2输出的一个“行”,然后将其与初始输入一起反馈到网络中以获取下一个输出;在训练时,您将重复49次输入以及“先前”的标签(第一个标签为空标签)。
如果没有要利用的顺序关系(即输入和输出的顺序没有特殊含义),那么该问题只能由最初的122,500个输出单元(加上您可能需要正确处理这些单元的所有隐藏单元)真正表示。您还可以尝试在常规网络和RNN之间寻找某种中间地带,其中包括两个softmax输出以及118长向量,以及您想要的输出的“id”(例如作为49长的独热编码向量);如果49个输出中每个标签的“含义”相似或可比较,它可能会起作用。

1
有一个使用CTC损失函数的Keras示例,请查看https://github.com/fchollet/keras/blob/master/examples/image_ocr.py,支持TensorFlow和Theano。 - indraforyou
@indraforyou,WAAAT Keras 确实 有CTC?!我记得在某个地方读到过它没有(可能是关于某个旧版本的),甚至没有仔细检查...真丢人!:S非常感谢你提到它。 - jdehesa
谢谢!我的每个输出集都有一个内部层次结构。我的下一个里程碑是实现每个输出集中的可变行数,这将使其成为一个可变多输出多类问题。您认为RNNs LSTM也能处理这个任务吗? - Julien Bélanger
@JulienBélanger 我认为RNN可能会有所帮助,尽管如果您事先不知道输出的长度,则最棘手的部分当然是要知道何时开始和结束预测时的有趣输出。如果您将输入视为序列,则输出的长度最多应与输入一样长,并且您可以使用类似CTC的东西(尽管这更像是“对输入序列进行分段并为每个段分配标签”,我不确定这是否是您想要的)。如果您的输入不是序列,但仍然使用RNN,则需要找出何时停止! - jdehesa
@jdehesa 没问题 - indraforyou
@jdehesa 你好,我有一个类似的问题,我认为你可能会有一些有趣的建议:https://dev59.com/f7voa4cB1Zd3GeqP0kjS 请让我知道你的想法。谢谢 :) - EmJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接