У меня есть матрица данных в "однократной кодировке" (все единицы и нули) с 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, работающая на Linux-машине, только CPU. Я тестировал его с последней версией Theano, и я также получаю Nans, поэтому я попытался перейти к Theano 0.8.2 и иметь такую же проблему. С последней версией Keras такая же проблема, а также с версией 0.3.2.