我用keras(一个convnet)构建了一个自定义体系结构。该网络有4个头,每个头输出不同大小的张量。我试图编写一个自定义损失函数作为这4个输出的函数。我以前曾实施过客户损失,但要么是每个头损失不同,要么是每个头损失相同。在这种情况下,我需要组合4个输出来计算损耗。
我已经习惯了:
| OrderID |
|---------|
| O2 |
| O3 |
| O4 |
| O5 |
但是对于我来说,我需要y_pred作为4个输出的列表。我可以用零填充输出,并在模型中添加一个连接层,但是我想知道是否有更简单的方法。
编辑
我的损失函数相当复杂,我可以写点什么:
def custom_loss(y_true, y_pred):
return ....
model.compile(optimizer, loss=custom_loss....)
其中自定义损失定义为:
model.add_loss(custom_loss(input1, input2, output1, output2))
答案 0 :(得分:3)
您可以尝试使用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_2) * mse(output_2, label_layer_2))
# Add loss to model
model.add_loss(loss)
# Compile without specifying a loss
model.compile(optimizer='sgd')
model.fit([features, labels_1, labels_2], epochs=2)
答案 1 :(得分:0)
拟合模型时不需要虚拟变量
所以,你可能会使用 model.fit([特征,labels_1,labels_2],epochs=2)
然后它在
下运行良好tensorflow 版本 '1.14.0' keras.版本 '2.3.1'