我有一个“一键编码”(全1和全0)的数据矩阵,具有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)] )
但是,在训练过程中,我看到损失下降得很好,但是在第二个时期的中间,它就变成了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
,尝试使用和不使用辍学,但都无济于事。我尝试使用较小的模型,即仅具有一个隐藏层,并且存在相同的问题(在不同的点它变得很困难)。但是,它确实具有较少的功能,即只有5列,并且给出了很好的预测。似乎有某种溢出,但我无法想象为什么-损失根本不是不合理的大。
Python版本2.7.11,仅在CPU上的Linux机器上运行。我使用最新版的Theano进行了测试,并且我也得到了Nans,因此我尝试使用Theano 0.8.2并遇到了同样的问题。与最新版本的Keras具有相同的问题,并且也与0.3.2版本相同。