Jul*_*ger 7 neural-network keras keras-layer
对于我拥有的每个输入,我都有一个关联的 49x2 矩阵。这是一对输入输出对的样子
input :
[Car1, Car2, Car3 ..., Car118]
output :
[[Label1 Label2]
[Label1 Label2]
...
[Label1 Label2]]
Run Code Online (Sandbox Code Playgroud)
其中 Label1 和 Label2 都是 LabelEncode,它们分别有 1200 和 1300 个不同的类。
只是为了确保这就是我们所说的多输出多类问题?
我试图展平输出,但我担心模型无法理解所有类似的 Label 共享相同的类。
是否有一个 Keras 层可以处理输出这种奇特的数组形状?
一般来说,多类问题与输出一组类的概率分布的模型相对应(通常通过交叉熵根据实际类的单热编码进行评分)。现在,无论您将其构造为一个输出、两个输出、49 个输出还是 49 x 2 = 98 个输出,这都意味着拥有 1,200 x 49 + 1,300 x 49 = 122,500 个输出单元 - 这不是计算机无法做到的手柄,但也许不是最方便的东西。您可以尝试让每个类输出成为单个(例如线性)单位并对其值进行舍入以选择标签,但是,除非标签具有某种数字含义(例如顺序、大小等),否则这不太可能起作用。
如果输入中元素的顺序有一定的意义(也就是说,打乱顺序会影响输出),我想我会通过 RNN 来解决这个问题,比如 LSTM 或双向 LSTM 模型,有两个输出。使用return_sequences=TruesoftmaxTimeDistributed Dense层作为输出,对于每个 118 长的输入,您将有 118 对输出;那么你可以使用时间样本加权来删除,例如,前 69 个(或者如果你使用的是双向模型,则可以执行诸如删除第 35 个和最后 34 个之类的操作)并计算剩余 49 对的损失标签。或者,如果这对您的数据有意义(也许没有),您可以使用更高级的东西,例如CTC (虽然 Keras 没有它,但我试图将TensorFlow 实现集成到其中,但没有取得太大成功),这也在Keras 中实现(感谢@indraforyou)!。
如果输入中的顺序没有意义,但输出的顺序有意义,那么您可以使用一个 RNN,其中输入是原始 118 长向量加上一对标签(每个标签都是单热编码的),输出是又是一对标签(又是两个 softmax 层)。这个想法是,你在每一帧上获得 49x2 输出的一“行”,然后将其与初始输入一起反馈到网络以获取下一个;在训练时,您会将输入与“前一个”标签(第一个标签为空标签)一起重复 49 次。
如果没有可利用的顺序关系(即输入和输出的顺序没有特殊含义),那么问题只能由最初的 122,500 个输出单元(加上您可能需要的所有隐藏单元)来真正表示。做对)。您还可以尝试在常规网络和 RNN 之间采取某种中间立场,其中您有两个 softmax 输出,并且除了 118 长向量之外,还包括您想要的输出的“id”(例如,作为 49 -长one-hot编码向量);如果 49 个输出中每个标签的“含义”相似或具有可比性,则它可能有效。