我有一个"one-hot encoding"(全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)] )
Run Code Online (Sandbox Code Playgroud)
然而,在训练过程中,我看到损失减少很好,但在第二个时代的中期,它变为南:
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
Run Code Online (Sandbox Code Playgroud)
我尝试使用RMSProp
而不是SGD
,我试过tanh
而不是relu
,我试着有没有辍学,都无济于事.我尝试使用较小的模型,即只有一个隐藏层,同样的问题(它在不同的点变成了nan).但是,它确实可以使用较少的功能,即如果只有5列,并提供了很好的预测.似乎存在某种溢出,但我无法想象为什么 - 损失根本不是非常大.
Python版本2.7.11,在linux机器上运行,仅限CPU.我用最新版本的Theano测试了它,我也得到了Nans,所以我尝试去Theano …
我正在构建一个模型,使用循环图层(GRU)将字符串转换为另一个字符串.我已经尝试了Dense和TimeDistributed(密集)层作为最后一层,但我不明白使用return_sequences = True时两者之间的区别,特别是因为它们似乎具有相同数量的参数.
我的简化模型如下:
InputSize = 15
MaxLen = 64
HiddenSize = 16
inputs = keras.layers.Input(shape=(MaxLen, InputSize))
x = keras.layers.recurrent.GRU(HiddenSize, return_sequences=True)(inputs)
x = keras.layers.TimeDistributed(keras.layers.Dense(InputSize))(x)
predictions = keras.layers.Activation('softmax')(x)
Run Code Online (Sandbox Code Playgroud)
网络摘要是:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 15) 0
_________________________________________________________________
gru_1 (GRU) (None, 64, 16) 1536
_________________________________________________________________
time_distributed_1 (TimeDist (None, 64, 15) 255
_________________________________________________________________
activation_1 (Activation) (None, 64, 15) 0
=================================================================
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义,因为我对TimeDistributed的理解是它在所有时间点都应用相同的层,因此Dense层有16*15 + 15 = 255个参数(权重+偏差).
但是,如果我切换到一个简单的Dense图层:
inputs = keras.layers.Input(shape=(MaxLen, InputSize))
x = keras.layers.recurrent.GRU(HiddenSize, return_sequences=True)(inputs)
x = …
Run Code Online (Sandbox Code Playgroud) machine-learning neural-network keras recurrent-neural-network keras-layer