在Keras中训练神经网络时出现’loss: nan’

我在Keras中训练一个神经网络。在第一个epoch的训练过程中,损失值首先返回,然后在第一个epoch结束之前突然变成loss: nan,准确率显著下降。从第二个epoch开始,loss: nan继续出现,而准确率变为0。接下来的所有epoch都持续这种情况。

令人沮丧的是,每次训练的输出似乎都没有一致性。也就是说,loss: nan会在第一个epoch的不同点出现。

这个网站上有几个问题提供了解决类似问题的“指南”,但我还没有看到在Keras中明确解决此问题的指南。我正在尝试让我的神经网络对1或0进行分类。

以下是我尝试过的一些方法,后面将展示我的输出和代码。

标准化 // 归一化

我在这里发布了一个关于我的数据的问题。我成功解决了这个问题,并对我的数据集应用了sklearn的StandardScaler()MinMaxScaler()。两种标准化和归一化方法都没有解决我的问题。

学习率

我尝试过的优化器有adamSGD。在这两种情况下,我尝试降低标准学习率,看看是否有帮助,但两种情况下都出现了相同的问题。

激活函数

我认为使用relu是相当标准的做法,但我也在网上看到有人提到使用tanh,我试过了,但没有效果。

批量大小

我尝试了32、50、128、200。50让我在第一个epoch中走得最远,其他的没有帮助。

对抗过拟合

我在网络中添加了一个dropout层,并尝试了许多不同的数值。

其他观察

  • 对于数据的维度,epochs训练得非常快(我可能错了)。
  • loss: nan可能与我的损失函数binary_crossentropy有关,可能是某些值让这个损失函数难以处理。
  • kernel_initializer='uniform'在我的探索过程中一直未被触及和考虑。
  • 网上还告诉我,我的数据中可能存在nan值,但我认为那是导致他们脚本崩溃的错误。
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
X_train_total_scale = sc.fit_transform((X_train))
X_test_total_scale = sc.transform((X_test))
print(X_train_total_scale.shape) #(4140, 2756)
print(y_train.shape) #(4140,)
##NN
adam = keras.optimizers.Adam(lr= 0.0001)
sgd = optimizers.SGD(lr=0.0001, decay=1e-6, momentum=0.9, nesterov=True)
classifier = Sequential()
classifier.add(Dense(output_dim = 1379, kernel_initializer='uniform', activation='relu', input_dim=2756))
classifier.add(Dropout(0.6))
classifier.add(Dense(output_dim = 1379, kernel_initializer='uniform', activation='relu'))
classifier.add(Dense(output_dim = 1, kernel_initializer='uniform', activation='sigmoid'))
classifier.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['accuracy'])
classifier.fit(X_train_total_scale, y_train, validation_data=(X_test_total_scale, y_test), batch_size=50, epochs=100)

(显示批量大小为200,以避免文本块过大)

200/4140 [>.............................] - ETA: 7s - loss: 0.6866 - acc: 0.5400
400/4140 [=>............................] - ETA: 4s - loss: 0.6912 - acc: 0.5300
600/4140 [===>..........................] - ETA: 2s - loss: nan - acc: 0.5300
800/4140 [====>.........................] - ETA: 2s - loss: nan - acc: 0.3975
1000/4140 [======>.......................] - ETA: 1s - loss: nan - acc: 0.3180
1200/4140 [=======>......................] - ETA: 1s - loss: nan - acc: 0.2650
1400/4140 [=========>....................] - ETA: 1s - loss: nan - acc: 0.2271
1600/4140 [==========>...................] - ETA: 1s - loss: nan - acc: 0.1987
1800/4140 [============>.................] - ETA: 1s - loss: nan - acc: 0.1767
2000/4140 [=============>................] - ETA: 0s - loss: nan - acc: 0.1590
2200/4140 [==============>...............] - ETA: 0s - loss: nan - acc: 0.1445
2400/4140 [================>.............] - ETA: 0s - loss: nan - acc: 0.1325
2600/4140 [=================>............] - ETA: 0s - loss: nan - acc: 0.1223
2800/4140 [===================>..........] - ETA: 0s - loss: nan - acc: 0.1136
3000/4140 [====================>.........] - ETA: 0s - loss: nan - acc: 0.1060
3200/4140 [======================>.......] - ETA: 0s - loss: nan - acc: 0.0994
3400/4140 [=======================>......] - ETA: 0s - loss: nan - acc: 0.0935
3600/4140 [=========================>....] - ETA: 0s - loss: nan - acc: 0.0883
3800/4140 [==========================>...] - ETA: 0s - loss: nan - acc: 0.0837
4000/4140 [===========================>..] - ETA: 0s - loss: nan - acc: 0.0795
4140/4140 [==============================] - 2s 368us/step - loss: nan - acc: 0.0768 - val_loss: nan - val_acc: 0.0000e+00
Epoch 2/100
200/4140 [>.............................] - ETA: 1s - loss: nan - acc: 0.0000e+00
400/4140 [=>............................] - ETA: 0s - loss: nan - acc: 0.0000e+00
600/4140 [===>..........................] - ETA: 0s - loss: nan - acc: 0.0000e+00
800/4140 [====>.........................] - ETA: 0s - loss: nan - acc: 0.0000e+00
1000/4140 [======>.......................] - ETA: 0s - loss: nan - acc: 0.0000e+00
1200/4140 [=======>......................] - ETA: 0s - loss: nan - acc: 0.0000e+00
1400/4140 [=========>....................] - ETA: 0s - loss: nan - acc: 0.0000e+00
1600/4140 [==========>...................] - ETA: 0s - loss: nan - acc: 0.0000e+00
... and so on...

我希望能够完成一次完整的训练(当然),但我也想了解人们是如何自己解决这些问题的直觉!


回答:

首先,检查你的数据集中是否有NaN或inf值。

你可以尝试不同的优化器,例如rmsprop。学习率可以更小,尽管我自己没有使用过低于0.0001的学习率(你正在使用的就是这个值)。

我认为使用relu是相当标准的做法,但我也在网上看到有人提到使用tanh,我试过了,但没有效果

如果你对此感到担忧,可以尝试使用leaky relu或elu。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注