【发布时间】:2016-09-10 23:53:16
【问题描述】:
我有一个具有 260,000 行和 35 列的“单热编码”(全一和零)数据矩阵。我正在使用 Keras 训练一个简单的神经网络来预测一个连续变量。制作网络的代码如下:
model = Sequential()
model.add(Dense(1024, input_shape=(n_train,)))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dropout(0.1))
model.add(Dense(1))
sgd = SGD(lr=0.01, nesterov=True);
#rms = RMSprop()
#model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy'])
model.compile(loss='mean_absolute_error', optimizer=sgd)
model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, verbose=1, validation_data=(X_test,Y_test), callbacks=[EarlyStopping(monitor='val_loss', patience=4)] )
但是,在训练过程中,我看到损失很好地减少了,但是在第二个 epoch 的中间,它变成了 nan:
Train on 260000 samples, validate on 64905 samples
Epoch 1/3
260000/260000 [==============================] - 254s - loss: 16.2775 - val_loss:
13.4925
Epoch 2/3
88448/260000 [=========>....................] - ETA: 161s - loss: nan
我尝试使用RMSProp 而不是SGD,我尝试使用tanh 而不是relu,我尝试了有无dropout,但都无济于事。我尝试了一个较小的模型,即只有一个隐藏层,同样的问题(它在不同的点变成了 nan)。但是,它确实适用于较少的特征,即如果只有 5 列,并且给出了相当好的预测。似乎有某种溢出,但我无法想象为什么——损失一点也不大。
Python 版本 2.7.11,在 linux 机器上运行,仅 CPU。我用最新版本的 Theano 测试了一下,也得到了 Nans,所以我尝试去 Theano 0.8.2 也遇到了同样的问题。用最新版的 Keras 也有同样的问题,而且用的是 0.3.2 版本。
【问题讨论】:
-
尝试 loss='mean_squared_error', optimizer='adam' 与单个隐藏层 - 仍然是 nans?
-
@1'' 将上述模型与 Adam 优化器一起使用时,我得到了 nans。只有一层,它不会在三个训练周期中给出 nans。
-
对于未来的读者,这里是一个相关的 keras 线程。 github.com/keras-team/keras/issues/2134 通过结合这里提到的所有建议,我取得了一些成功。例如添加batchnorm,改变学习率,优化器,添加clip_by_value,clip_by_global_norm,最后,多次梳理代码以查找错误也有帮助,例如在一个卷积层之后缺少批处理规范层。 :)
-
检查 NAN 值它解决了我的问题... :)
标签: python keras neural-network theano loss-function