我有一个大小为260,000行35列的“one-hot编码”(全是1和0)的数据矩阵。我使用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个列,它会正常工作并且给出相当好的预测结果。似乎存在某种溢出问题,但我无法想象原因——损失并不是不合理的大。
运行在CPU上的Linux机器上的Python版本为2.7.11。我用最新版本的Theano进行了测试,也遇到Nan问题,所以我尝试转向Theano 0.8.2并面临同样的问题。最新版本的Keras也有同样的问题,0.3.2版本也是如此。