我正在尝试在自定义损失函数中使用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)