keras 为什么LSTM会产生NaN损失?

bvhaajcl  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(255)

我正在实现我的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损失。

mzsu5hc0

mzsu5hc01#

model.add(LSTM(lstm_out1, Dropout(0.2), Dropout(0.2)))

这个Dropout层看起来不正确。我认为你应该使用dropout=0.2,recurrent_dropout=0.2。参考文档https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM
此外,您的嵌入初始化可以在weights=[embed_matrix]中包含nan个值

lg40wkob

lg40wkob2#

但是为什么要使用binary_crossentropy?你有2个输出神经元。奇怪的是,你有2个输出神经元的sigmoid激活。在这种情况下,你有2个选择:
1.你可以使用sparse_categorical_crossentropy(或categorical_crossentropy,取决于你是否有one_hot),2个输出神经元和softmax激活。
1.你可以使用binary_crossentropy,只有一个输出神经元,并使用sigmoid激活。
我想那就是个错误。
编辑:我将根据您的代码给予您一个工作示例,以便您可以进行比较。

x_train = np.random.randint(0, 100, (1000, 10))
y_train = np.random.randint(0, 2, (1000,))

vocab_size = 100
embed_dim = 10
max_tweet_len = 10

model = keras.models.Sequential()
model.add(layers.Embedding(vocab_size, embed_dim, input_length=max_tweet_len, trainable=False))
model.add(layers.LSTM(10, dropout=0.2, recurrent_dropout=0.2))
#model.add(MaxPooling1D(2))
model.add(layers.Dense(64, activation='relu'))

model.add(layers.Dense(1, activation='sigmoid'))

opt = keras.optimizers.Adam(learning_rate=0.001)
  
model.compile(loss='binary_crossentropy',
                  optimizer=opt,
                  metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, batch_size=32)

相关问题