【问题标题】:Keras - Making two predictions from one neural networkKeras - 从一个神经网络做出两个预测
【发布时间】:2017-12-09 05:38:52
【问题描述】:

我正在尝试组合由同一网络产生的两个输出,该网络对 4 类任务和 10 类任务进行预测。然后我希望将这些输出组合起来以给出一个长度为 14 的数组,我将其用作我的最终目标。

虽然这似乎很有效,但预测总是针对一个类,所以它产生一个概率分布,它只关心从 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 之后获取每一层的输出,但是我不确定如何为要训练的每一个东西设置损失函数。

有什么想法吗?

非常感谢

【问题讨论】:

    标签: python tensorflow keras lstm loss-function


    【解决方案1】:

    您不需要连接输出,您的模型可以有两个输出:

    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

    【讨论】:

    • 啊!谢谢你。我认为必须有一种相当简单的方法来做到这一点。那么,当我运行我的 model.predict 时,我应该得到每一个的输出吗?
    猜你喜欢
    • 2021-01-07
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 2019-09-10
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多