如何为喀拉拉邦的损失函数赋予条件

时间:2019-12-20 09:18:50

标签: python tensorflow keras

说模型看起来像这样

inp = input()
feature = some_feature_layer()(inp)
out_1 = Dense(1,activation='sigmoid')(feature)
out_2 = Dense(10, activation='softmax')(feature)

我想要的是使用out_1加权我用于out_2的损失,这意味着out_2的损失应该类似于

out_2_loss = out_1 * some_loss_function(y_true, out2)

我想到了将损失写在模型内部,使用损失函数作为模型输出,然​​后像这样简单地增加/减少损失:

model = Model(inputs=[inp], outputs=[out_1, out_2_loss])

然后,问题就变成了如何将不同的损耗映射到不同的输出。可以在keras中使用这样的映射吗?

loss = {out_1 : 'binary_crossentropy',
out_2_loss : linear_function}

2 个答案:

答案 0 :(得分:1)

基本上有两种方法可以将不同的损失映射到不同的输出。

方法1: 如果输出已命名,请使用dict将名称映射到相应的损失:

out1 = Dense(10, activation='softmax', name='binary_crossentropy')(x)
out2 = Dense(10, name='out2')(x)

model = Model(x, [out1, out2])
model.compile(loss={'binary_crossentropy': 'binary_crossentropy', 'out2': out_2_loss},
          optimizer='adam')

方法2: 使用损失清单

model = Model(x, [out1, out2])
model.compile(loss=['binary_crossentropy', out_2_loss], optimizer='adam')

答案 1 :(得分:0)

您不能在此处将特殊关键字声明为python变量,例如“ in”。 尝试声明一些其他变量名称,它将起作用。

input_1 = input()
feature = some_feature_layer()(input_1)
out_1 = Dense(1,activation='sigmoid')(feature)
out_2 = Dense(10, activation='softmax')(feature)
out_2_loss = out_1 * some_loss_function(y_true, out2)
model = Model(inputs=[input_1], outputs=[out_1, out_2_loss])
loss = {out_1 : 'binary_crossentropy',out_2 : linear_function}