使用自定义丢失时出现keras错误

时间:2018-05-21 07:53:51

标签: keras deep-learning

我在Keras中使用了一个简单的BiLSTM模型和我自己的自定义丢失函数。 见下文。

model = Sequential()
model.add(Bidirectional(LSTM(128, return_sequences=True), input_shape=(1,8)))
model.add(Bidirectional(LSTM(128)))
model.add(Dense(64, activation='relu'))
model.add(Dense(20, activation='softmax'))

def my_loss_np(y_true, y_pred):

    labels = [np.argmax(y_pred[i]) for i in range(y_pred.shape[1])]

    loss = np.mean(labels)
    return loss

import keras.backend as K
def my_loss(y_true, y_pred):
    loss = K.eval(my_loss_np(K.eval(y_true), K.eval(y_pred)))
    return loss

当我编译这个模型时,我收到一个错误 -

model.compile(loss=my_loss, optimizer='adam')

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dense_95_target' with dtype float and shape [?,?]
     [[Node: dense_95_target = Placeholder[dtype=DT_FLOAT, shape=[?,?], _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]

1 个答案:

答案 0 :(得分:0)

您的损失功能存在以下几个问题:

  1. 你在张量上使用NumPy,不幸的是它虽然直观但不起作用。您需要使用Keras backend中的张量运算符,它们非常相似。
  2. 为此,您正在调用K.eval,但在此阶段您仍在构建符号计算图,该图将在TensorFlow或Theano中运行。因此,张量不具备计算每个人的价值,你需要保持它的象征性,你可以得到像你在NumPy中所做的任何价值。
  3. 即使您解决了上述问题,也使用了不可微分的操作argmax,这种操作不适用于梯度下降算法。
  4. 您的模型看起来像一个多标签分类问题,最后一层有20个类,其中softmax是20。在这种情况下,文献使用categorical-crossentropy损失来训练分类器网络。