我正在尝试组合由同一网络生成的两个输出,这些输出对4类任务和10类任务进行预测。然后我想结合这些输出给出一个长度为14的数组,我用它作为我的最终目标。
虽然这似乎是积极的,但预测总是针对一个类,所以它产生概率dist,只关注选择14个选项中的1个而不是2.我实际需要它做的是提供2个预测,每个班级一个。我希望所有这些都由同一型号生产。
input = Input(shape=(100, 100), name='input')
lstm = LSTM(128, input_shape=(100, 100)))(input)
output1 = Dense(len(4), activation='softmax', name='output1')(lstm)
output2 = Dense(len(10), activation='softmax', name='output2')(lstm)
output3 = concatenate([output1, output2])
model = Model(inputs=[input], outputs=[output3])
我的问题是确定适当的损失函数和预测方法?对于预测,我可以简单地在softmax之后获取每一层的输出,但是我不确定如何为每一个要训练的东西设置损失函数。
有什么想法吗?
非常感谢
答案 0 :(得分:5)
您不需要连接输出,您的模型可以有两个输出:
input = Input(shape=(100, 100), name='input')
lstm = LSTM(128, input_shape=(100, 100)))(input)
output1 = Dense(len(4), activation='softmax', name='output1')(lstm)
output2 = Dense(len(10), activation='softmax', name='output2')(lstm)
model = Model(inputs=[input], outputs=[output1, output2])
然后,为了训练这个模型,你通常会使用两个加权来产生一个损失:
model.compile(optimizer='sgd', loss=['categorical_crossentropy',
'categorical_crossentropy'], loss_weights=[0.2, 0.8])
只需确保正确格式化数据,因为现在每个输入样本对应两个输出标记样本。有关详细信息,请查看Functional API Guide。