我正在训练一个 keras 神经网络。我想要一个由 y_true*y_pred 给出的自定义损失函数。这是允许的吗?

Posted

技术标签:

【中文标题】我正在训练一个 keras 神经网络。我想要一个由 y_true*y_pred 给出的自定义损失函数。这是允许的吗?【英文标题】:I am training a keras neural net. I would like to have a custom loss function given by y_true*y_pred. Is this allowed? 【发布时间】:2017-09-12 01:20:56 【问题描述】:

这是我的模型的 sn-p:

W1 = create_base_network(latent_dim)

input_a = Input(shape=(1,latent_dim))
input_b = Input(shape=(1,latent_dim))

x_a = encoder(input_a)
x_b = encoder(input_b)

processed_a = W1(x_a)
processed_b = W1(x_b)

del1 = Lambda(Delta1, output_shape=Delta1_output_shape)([processed_a, processed_b])
model = Model(input=[input_a, input_b], output=del1)

# train
rms = RMSprop()
model.compile(loss='kappa_delta_loss', optimizer=rms)

基本上,神经网络获取两个输入的(预训练)编码器表示,并通过 MLP 计算两个输入的预测值差异。这个差异是 Delta1,它是网络的 y_pred。我希望损失函数为 y_pred*y_true。但是,当我这样做时,我收到错误“无效的目标:kappa_delta_loss”。

我做错了什么?

【问题讨论】:

【参考方案1】:

您几乎自己回答了这个问题。创建你的目标 功能类似于 https://github.com/fchollet/keras/blob/master/keras/objectives.py 喜欢 这个,

 import theano import theano.tensor as T

 epsilon = 1.0e-9 
 def custom_objective(y_true, y_pred):
     '''Just another crossentropy'''
     y_pred = T.clip(y_pred, epsilon, 1.0 - epsilon)
     y_pred /= y_pred.sum(axis=-1, keepdims=True)
     cce = T.nnet.categorical_crossentropy(y_pred, y_true)
     return cce and pass it to compile argument

 model.compile(loss=custom_objective, optimizer='adadelta')

来自https://github.com/fchollet/keras/issues/369

因此,您应该使用两个参数创建自定义损失函数,第一个是目标,第二个是预测。

假设您的输出 (y_pred) 是一个标量,您的自定义目标可能是

def custom objective(y_true,y_pred)
    return K.dot(y_true,y_pred)

keras 后端的 K(比 theano 示例更通用)

【讨论】:

以上是关于我正在训练一个 keras 神经网络。我想要一个由 y_true*y_pred 给出的自定义损失函数。这是允许的吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Keras 中使用预训练的 CNN 实现连体网络?

训练时 Keras 神经网络精度始终为 0

在 R keras 中训练数组数据的内置卷积网络

Keras LSTM 训练数据格式

keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重

如何在 Keras 中训练网络以适应不同的输出大小