我正在Keras训练神经网络。在训练第一个纪元期间,损耗值会返回,然后在第一个纪元结束之前突然变为loss: nan
,从而大大降低了准确性。然后开始第二个纪元,loss: nan
继续,但精度为0。其余纪元继续如此。
令人沮丧的是,每次训练我的输出似乎都不一致。可以说,loss: nan
出现在第一个时期的不同点。
这个网站上有几个问题,为类似的问题提供了“指南”,我只是在喀拉拉邦还没有看到一个明确的例子。 我正在尝试让我的神经网络对1或0进行分类。
这是我做过的一些事情,在这之后是我的输出和代码。
我发布了一个有关我的数据here的问题。我能够弄清楚并在数据集上执行sklearn的StandardScaler()
和MinMaxScaler()
。标准化和标准化方法都无济于事。
我尝试过的优化器是adam
和SGD
。在这两种情况下,我都尝试降低标准学习率,以了解这是否有帮助,在两种情况下均如此。出现了同样的问题。
我认为使用relu
是很标准的,但是我在互联网上看到有人在谈论使用tanh
,尝试了一下,没有骰子。
尝试32、50、128、200。50使我进入了第一个时代,距离其他一切都没有帮助。
放入一个辍学层并尝试一堆数字。
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...
我希望能够接受完整的培训(duh),但是我也想了解一些直觉,人们必须自己解决这些问题!
答案 0 :(得分:1)
首先,检查数据集中的NaN或inf。
您可以尝试其他优化器,例如rmsprop。 学习率可能会更小,尽管我自己没有使用低于0.0001(您正在使用的值)的东西。
我认为使用relu是非常标准的,但是我在互联网上看到有人在谈论使用tanh,尝试了一下,没有骰子
如果您对此担心,请尝试泄漏的relu,elu。