【问题标题】:'loss: nan' during training of Neural Network in Keras'loss: nan' 在 Keras 神经网络训练期间
【发布时间】:2019-12-17 18:29:58
【问题描述】:

我正在 Keras 中训练一个神经网络。在第一个 epoch 的训练期间,损失值返回,然后在第一个 epoch 结束之前突然变为loss: nan,显着降低了准确性。然后开始第二个 epoch,loss: nan 继续,但精度为 0。这将持续到其余的 epoch。

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

这个网站上有几个问题可以为类似的问题提供“指南”,我只是没有看到在 keras 中明确这样做过。 我试图让我的神经网络对 1 或 0 进行分类。

这是我所做的一些事情,这将是我的输出和代码。

标准化 // 标准化

我发布了一个关于我的数据here 的问题。我能够弄清楚并在我的数据集上执行 sklearn 的 StandardScaler()MinMaxScaler()。标准化和规范化方法都对我的问题没有帮助。

学习率

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

激活

我认为使用relu 很标准,但我在互联网上看到有人在谈论使用tanh,尝试了一下,没有骰子。

批量大小

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

打击过拟合

放入一个 dropout 层并尝试了一大堆数字。

其他观察

  • 对于数据的维度而言,epoch 的训练速度非常快(我可能是错的)。
  • 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...

我希望能够完成完整的培训(呃),但我也想了解人们必须自己解决这些问题的一些直觉!

【问题讨论】:

    标签: python-3.x machine-learning keras scikit-learn neural-network


    【解决方案1】:

    首先,检查数据集中的 NaN 或 inf。

    您可以尝试不同的优化器,例如rmsprop。 学习率可能会更小,尽管我自己没有使用低于 0.0001(这是你正在使用的)的任何东西。

    我认为使用 relu 很标准,但我在互联网上看到有人在谈论使用 tanh,尝试了一下,没有骰子

    如果你担心这个,试试leaky relu, elu。

    【讨论】:

    • 我已经对这些数据进行了缩放,如果有 nan 数字会不会崩溃?
    猜你喜欢
    • 1970-01-01
    • 2018-03-16
    • 2020-10-17
    • 2017-11-27
    • 2011-04-07
    • 1970-01-01
    • 2017-06-08
    • 2017-02-20
    • 2018-07-25
    相关资源
    最近更新 更多