Keras多路输出,定制损失功能

问题描述

我试图建立一个具有两个输入和两个输出的模型。模型的结构如下。 我想构造一个包含两个部分的客户损失函数:“ d_flat”和“ t_flat”之间的差异,以及“ perdict”层的绝对交叉熵损失。该模型是这样的:

initial_input_domain=tf.keras.Input(shape=(36,36,3))
initial_input_target=tf.keras.Input(shape=(36,3))

vgg_base=tf.keras.applications.VGG19(include_top=False,#weights='imagenet',input_shape=(36,3))

domain1=vgg_base(initial_input_domain)
target1=vgg_base(initial_input_target)

d_flat = tf.keras.layers.Flatten(name='d_flat')(domain1)
predictions=tf.keras.layers.Dense(num_classes,name='predict',activation='sigmoid')(d_flat)

t_flat = tf.keras.layers.Flatten(name='t_flat')(target1)
predictions_t=tf.keras.layers.Dense(num_classes,name='predict_t',activation='sigmoid')(t_flat)

fin_model=tf.keras.Model(inputs=[initial_input_domain,initial_input_target],outputs=[predictions,predictions_t])

enter image description here

我编写的损失函数如下:

def Total_loss(d_flat,t_flat):

    def loss_function(y_true,y_pred):

        dist_LOSS = 'something does not matter' # the difference of two layers
        loss = K.categorical_crossentropy(y_true,y_pred) + dist_LOSS
        return loss

    return loss_function

所以我的问题是此函数中的y_pred和y_true是什么?我只希望此函数计算“预测”的绝对交叉熵损失,这是左侧的部分。我应该怎么做才能使喀拉拉邦不计算正确部分的绝对交叉熵损失?似乎y_pred和y_true是左右分支的组合。 (我在右侧使用的标签是正确的标签,我在右侧使用的标签全为0,表示没有任何意义)

Keras生成这些输出

Epoch 1/100
6912/6912 [==============================] - 24s 3ms/sample - loss: 0.0315 - predict_loss: 0.0270 - predict_t_loss: 0.0045 - predict_categorical_accuracy: 0.9931 - predict_t_categorical_accuracy: 0.6413

似乎损失=预测损失+预测损失。它应该是任何预报。任何建议表示赞赏。谢谢!

解决方法

自定义损失功能只能与(y_true,y_pred)一起使用。如果您想使用在之前定义的其他变量,例如d_flat,t_flat或仅输出的一部分,您必须使用model.add_loss。如您在API中所见,您可以在自己的自定义层(为您提供更具体的控件)中定义它,也可以在模型本身上定义它。在您的情况下,您可以执行以下操作:

model.add_loss(d_flat - f_flat + K.categorical_crossentropy(predictions,y_pred_for_left_output)

其中y_pred_for_left_output是此输出节点的标签张量。这样,您将损耗定义为仅平坦层和左侧输出节点的CE之差。您可以根据自己的特定需求进行调整,但这是正确的方法。