Keras:在自定义损失函数中预测模型

时间:2018-09-11 21:44:30

标签: numpy tensorflow keras

我正在尝试在自定义损失函数中使用some_model.predict(x)

我发现了这个自定义损失函数:

_EPSILON = K.epsilon()

def _loss_tensor(y_true,y_pred):

y_pred = K.clip(y_pred, _EPSILON, 1.0-_EPSILON)
out = -(y_true * K.log(y_pred) + (1.0 - y_true) * K.log(1.0 - y_pred))
return K.mean(out, axis=-1)

但是问题是model.predict()正在使用一个numpy数组。 因此,我寻找了如何将张量(y_pred)转换为numpy数组。 我发现了tmp = K.tf.round(y_true),但这返回了张量。 我还发现:x = K.eval(y_true)使用Keras变量并返回一个numpy数组。 这将产生错误:You must feed a value for placeholder tensor 'dense_78_target' with dtype float....。 有人建议将学习阶段设置为true。我做到了,但没有帮助。

我只想做的事

def _loss_tensor(y_true, y_pred):
y_tmp_true = first_decoder.predict(y_true)
y_tmp_pred = first_decoder.predict(y_pred)

return keras.losses.binary_crossentropy(y_tmp_true,y_tmp_pred)

任何帮助将不胜感激。

这有效:

sess = K.get_session()
with sess.as_default():
  tmp = K.tf.constant([1,2,3]).eval()
  print(tmp)

我现在也尝试过:

tmp = first_decoder(y_true)

这使断言失败:

assert input_shape[-1]

也许有人知道如何解决这个问题?

更新: 我现在可以通过以下方式将其输入模型:

y_t = first_decoder(K.reshape(y_true, (1,512)))
y_p = first_decoder(K.reshape(y_pred, (1,512)))

但是当我尝试返回二进制交叉熵时,形状不正确:

Input to reshape is a tensor with 131072 values, but the requested shape has 
512

我发现131072是我的批次大小和输入大小(256 * 512)的乘积。然后,我采用我的代码将其重塑为(256,512)大小。第一批运行正常,但随后出现另一个错误,即传递的大小为(96,512)。

[已解决]更新: 现在可以使用了:

def _loss_tensor(y_true, y_pred):
    num_ex = K.shape(y_true)[0]
    y_t = first_decoder(K.reshape(y_true, (num_ex,512)))
    y_p = first_decoder(K.reshape(y_pred, (num_ex,512)))

    return keras.losses.binary_crossentropy(y_t,y_p)

0 个答案:

没有答案