目前,我的模型有以下输出:
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]计算损失,这会引发形状不匹配错误。