我正在实现我的LSTM模型用于讽刺检测(二进制)。我写了以下代码:
model = Sequential()
model.add(Embedding(vocab_size, embed_dim,
weights=[embed_matrix], input_length=max_tweet_len, trainable=False))
model.add(LSTM(lstm_out1, Dropout(0.2), Dropout(0.2)))
#model.add(MaxPooling1D(2))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
opt = Adam(learning_rate=0.001)
model.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
我的模型预测了NaN。
[[nan nan]
[nan nan]
[nan nan]
...
[nan nan]
[nan nan]
[nan nan]]
为什么会这样?我的输入维度是(75830,79)。我已经检查了缺失值/nans。数据中没有这样的异常。我使用了这个代码。在所有情况下,代码返回false。
check_nan = df['is_sarcastic'].isnull().values.any()
print(check_nan)
check_na = df['is_sarcastic'].isna().values.any()
print(check_na)
check_nan_ = df['tweet_text'].isnull().values.any()
print(check_nan_)
check_na_ = df['tweet_text'].isna().values.any()
print(check_na_)
编辑
1.使用的grad剪裁
1.较小学习率
仍然是NaN损失。
2条答案
按热度按时间mzsu5hc01#
这个Dropout层看起来不正确。我认为你应该使用dropout=0.2,recurrent_dropout=0.2。参考文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM。
此外,您的嵌入初始化可以在weights=[embed_matrix]中包含nan个值
lg40wkob2#
但是为什么要使用binary_crossentropy?你有2个输出神经元。奇怪的是,你有2个输出神经元的sigmoid激活。在这种情况下,你有2个选择:
1.你可以使用sparse_categorical_crossentropy(或categorical_crossentropy,取决于你是否有one_hot),2个输出神经元和softmax激活。
1.你可以使用binary_crossentropy,只有一个输出神经元,并使用sigmoid激活。
我想那就是个错误。
编辑:我将根据您的代码给予您一个工作示例,以便您可以进行比较。