通常,多类问题对应于模型输出一组类的概率分布(通常通过交叉熵对实际类的单热编码进行评分)。现在,无论您是将其构建为单个输出、两个输出、49 个输出还是 49 x 2 = 98 个输出,这意味着拥有 1,200 x 49 + 1,300 x 49 = 122,500 个输出单元 - 这不是计算机无法做到的处理,但也许不是最方便的东西。您可以尝试让每个类输出为单个(例如线性)单元并舍入它的值以选择标签,但是,除非标签具有某种数字含义(例如顺序、大小等),否则这不太可能起作用.
如果输入中元素的顺序有某种意义(也就是说,改组它会影响输出),我想我会通过一个 RNN 来解决这个问题,比如 LSTM 或双向 LSTM 模型,有两个输出。对输出使用return_sequences=True
和TimeDistributed
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 -long one-hot 编码向量);如果 49 个输出中每个标签的“含义”相似或可比,它可能会起作用。