我正在训练一个 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 给出的自定义损失函数。这是允许的吗?的主要内容,如果未能解决你的问题,请参考以下文章