Keras - 负余弦近距离损失

时间:2017-11-11 23:27:42

标签: machine-learning keras neural-network lstm loss

我在Keras有一个小型神经网络。

contextTrain, contextTest, utteranceTrain, utteranceTest = train_test_split(context, utterance, test_size=0.1, random_state=1)
model = Sequential()
model.add(LSTM(input_shape=contextTrain.shape[1:], return_sequences=True, units=300, activation="sigmoid", kernel_initializer="glorot_normal", recurrent_initializer="glorot_normal"))
model.add(LSTM(return_sequences=True, units=300, activation="sigmoid", kernel_initializer="glorot_normal", recurrent_initializer="glorot_normal"))
model.compile(loss="cosine_proximity", optimizer="adam", metrics=["accuracy"])
model.fit(contextTrain, utteranceTrain, epochs=5000, validation_data=(contextTest, utteranceTest), callbacks=[ModelCheckpoint("model{epoch:02d}.h5", monitor='val_acc', save_best_only=True, mode='max')])

上下文和话语是具有形状的numpy数组,例如(100,15,300)。 fisrt LSTM的Input_shape应为(15,300)。

我不知道发生了什么,但突然在训练期间打印出负损失和val_loss。过去通常是正数(大约0.18左右)。

  

训练90个样本,验证10个样本

     

大纪元1/5000 90/90 [==============================] - 5s 52ms /步 -   损失:-0.4729 - acc:0.0059 - val_loss:-0.4405 - val_acc:0.0133

     

Epoch 2/5000 90/90 [==============================] - 2s 18ms /步 -   损失:-0.5091 - acc:0.0089 - val_loss:-0.4658 - val_acc:0.0133

     

大纪元3/5000 90/90 [==============================] - 2s 18ms /步 -   损失:-0.5204 - acc:0.0170 - val_loss:-0.4829 - val_acc:0.0200

     

Epoch 4/5000 90/90 [==============================] - 2s 20ms /步 -   损失:-0.5296 - acc:0.0244 - val_loss:-0.4949 - val_acc:0.0333

     

大纪元5/5000 90/90 [==============================] - 2s 20ms /步 -   损失:-0.5370 - acc:0.0422 - val_loss:-0.5021 - val_acc:0.0400

这是什么意思?可能的原因是什么?

感谢您的回复

1 个答案:

答案 0 :(得分:4)

您的损失函数cosine_proximity确实可以取负值;根据Keras创作者Francois Chollet的说法,它通常是否定的(Github comment):

  

损失只是您试图最小化的标量。不是   应该是积极的!例如,余弦接近损失将会   通常是负面的(试图尽可能地接近   最小化负标量。)

以下another example使用余弦接近度,其值也为负值。