Keras自定义损失与多个输出的关系

标签 keras deep-learning loss-function

我用keras(一个convnet)构建了一个自定义体系结构。该网络有4个头,每个头输出一个不同大小的张量。我试图编写一个自定义损失函数作为这4个输出的函数。我以前曾经实现过客户损失,但要么是每个人头损失不同,要么是每个人头损失相同。在这种情况下,我需要组合4个输出来计算损耗。

我已经习惯了以下几点:

def custom_loss(y_true, y_pred):
    return something
model.compile(optimizer, loss=custom_loss)

但就我而言,我需要y_pred作为4个输出的列表。我可以用零填充输出,并在模型中添加一个连接层,但是我想知道是否有更简单的方法。

编辑

我的损失函数相当复杂,我可以这样写吗:
model.add_loss(custom_loss(input1, input2, output1, output2))

自定义损失定义为:
def custom_loss(input1, input2, output1, output2):
    return loss

最佳答案

您可以尝试model.add_loss()函数。想法是将自定义损失构造为张量而不是函数,将其添加到模型中,然后在不进一步指定损失的情况下编译模型。另请参阅变式自动编码器的this implementation,其中使用了类似的想法。
例子:

import keras.backend as K
from keras.layers import Input, Dense
from keras.models import Model
from keras.losses import mse
import numpy as np

# Some random training data
features = np.random.rand(100,20)
labels_1 = np.random.rand(100,4)
labels_2 = np.random.rand(100,1)

# Input layer, one hidden layer
input_layer = Input((20,))
dense_1 = Dense(128)(input_layer)

# Two outputs
output_1 = Dense(4)(dense_1)
output_2 = Dense(1)(dense_1)

# Two additional 'inputs' for the labels
label_layer_1 = Input((4,))
label_layer_2 = Input((1,))

# Instantiate model, pass label layers as inputs
model = Model(inputs=[input_layer, label_layer_1, label_layer_2], outputs=[output_1, output_2])

# Construct your custom loss as a tensor
loss = K.mean(mse(output_1, label_layer_1) * mse(output_2, label_layer_2))

# Add loss to model
model.add_loss(loss)

# Compile without specifying a loss
model.compile(optimizer='sgd')

dummy = np.zeros((100,))
model.fit([features, labels_1, labels_2], dummy, epochs=2)

关于Keras自定义损失与多个输出的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51680818/

相关文章:

python - word2vec的RNN模型(GRU)回归未学习

python - 如何将自己的数据集提供给keras image_ocr

python - tensorflow 中的欧氏距离变换

python - caffe 可以同时接收一批不同分辨率的输入吗?如果是这样怎么办?

tensorflow - 为什么在TensorFlow Keras中损失函数和指标之间获得不同的值?

python-2.7 - 将 Keras 的指标与 sklearn.classification_report 的指标进行比较

python - Keras中的CNN模型条件层

python - Keras VGGnet 预训练模型可变大小输入

python - 优化pytorch中的多个损失函数

python - 为什么我的自定义损失函数不接受转换后的 numpy 数组?