TF/KERAS:将列表作为单个输出的损失传递

Posted

技术标签:

【中文标题】TF/KERAS:将列表作为单个输出的损失传递【英文标题】:TF/KERAS : passing a list as loss for single output 【发布时间】:2020-05-28 22:22:02 【问题描述】:

我的模型只有一个输出,但我想组合两个不同的损失函数(注意:类数 = 24)。

c = 0.8
lamda = 32

# My personalized loss function
def selective_loss(y_true, y_pred): .
    loss = K.categorical_crossentropy(
        K.repeat_elements(y_pred[:, -1:], CLASSES, axis=1) * y_true[:, :-1],
        y_pred[:, :-1]) + lamda * K.maximum(-K.mean(y_pred[:, -1]) + c, 0) ** 2
    return loss

p = np.ones(CLASSES) / CLASSES#The weights of class.

#And doing de model compile.
model.compile(loss = ['categorical_crossentropy', selective_loss],
              loss_weights = p,
              optimizer= sgd,                            
              metrics = ['accuracy'])

但它抱怨我需要两个输出,因为我定义了两个损失:

ValueError: When passing a list as loss, it should have one entry per model outputs. The model has 1 outputs, but you passed loss=['categorical_crossentropy', <function selective_loss at 0x7fcfb68daa60>]

您是否必须将这两种损失合二为一?如果是这样,你会怎么做?

或者最好有两个输出?这会影响预测吗?会怎么样?

【问题讨论】:

随着trainnig的最终更新,我有:73/142 [==============>............. .] - ETA:5:09 - 损失:nan - acc:0.0428 -selective_acc:nan - 覆盖率:0.0137。楠???? 终极更新是有道理的,防守是要走的路。 是的,但是火车进化的结果呢?例如,这个关于准确性的 nan 很奇怪。 【参考方案1】:

我在两个损失函数之间进行加权,使用 alpha 0.5 但其他浮点数也有效:

#Private loss is the selective_loss.
def total_loss(y_true, y_pred):
    alpha = 0.5
    return (1-alpha)*categorical_crossentropy(y_true, y_pred) + alpha*selective_loss(y_true, y_pred)

#Compile the model with weighting loss.
model.compile(loss = total_loss,
              loss_weights = p,
              optimizer= sgd,                            
              metrics = ['accuracy'])

【讨论】:

以上是关于TF/KERAS:将列表作为单个输出的损失传递的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow2深度学习基础和tf.keras

理解 LSTM 中的输入和输出形状 | tf.keras.layers.LSTM(以及对于return_sequences的解释)

tf.keras中度量和损失MSE之间的差异[重复]

tf.keras之损失函数

在 TF2/Keras 中正确实现 Autoencoder MSE 损失函数

模型输入必须来自 `tf.keras.Input` ...,它们不能是先前非输入层的输出