0

这是我的模型的片段:

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”。

我究竟做错了什么?

4

1 回答 1

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 示例更通用)

于 2017-04-16T11:04:05.703 回答