我在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"]()]]
答案 0 :(得分:0)
您的损失功能存在以下几个问题:
K.eval
,但在此阶段您仍在构建符号计算图,该图将在TensorFlow或Theano中运行。因此,张量不具备计算每个人的价值,你需要保持它的象征性,你可以得到像你在NumPy中所做的任何价值。argmax
,这种操作不适用于梯度下降算法。您的模型看起来像一个多标签分类问题,最后一层有20个类,其中softmax是20。在这种情况下,文献使用categorical-crossentropy
损失来训练分类器网络。