目前,我的模型有以下输出:
egen = keras.models.Model(egen_input, [classes,x])
其中x
的维度为[None, 32, 32, 3]
,而classes
的维度为[None, 2]
。如何在自定义损失函数中仅引用输出的一部分?
例如,
def customLoss(): def loss(y_true, y_pred): return keras.losses.binary_crossentropy(y_true, y_pred[0])return loss
当前上述损失函数返回了我关于维度不匹配的错误,但如果我只使用y_pred
,则不会返回错误…对此我感到非常困惑
谢谢!
回答:
如果您只想使用classes
(即第一个输出)来计算损失,您可以在编译时设置loss_weights
选项(https://keras.io/models/model/)。
model.compile(...., loss_weights=[1.0, 0.0])
还要注意,损失是分别为每个输出计算的,然后在输出之间平均(默认情况下权重相等)以获得单一损失指标。因此,y_pred[0]
并不表示classes
,而是classes
和x
的第一个元素。
编辑。
如果它是
classes
和x
的第一个元素,那么y_pred[0]
的形状会是什么?这里有点困惑
两者都是!Keras分别为classes
和x
计算损失,然后取(加权)平均。因此,如果损失函数定义为return keras.losses.binary_crossentropy(y_true, y_pred[0])
,如问题中所示,Keras会尝试使用classes_true
与class_pred[0]
以及x_true
与x_pred[0]
计算损失,这会引发形状不匹配错误。