在此先感谢您的帮助。
我正在处理4个字符序列的问题。我在训练集中有大约18.000个序列。使用Keras + TensorFlow后端。要预测的可能字符总数为52。
当我使用你在下面的“网络A”中看到大约490K参数的网络来学习时,网络极度过度拟合,验证损失就像疯狂一样增加,即使在300个时代也是如此。无论哪种方式,验证准确性都不会达到20%。
当我使用下面的“网络B”时,要学习大约8K参数,网络似乎没有学习。即使在3000个时期内,训练数据的准确度也不会超过40%,而验证集的准确率不会超过10%。
我在中间尝试了很多配置而没有任何真正的成功。
你有什么建议吗?
两种情况都使用以下配置:
rms = keras.optimizers.RMSprop(lr=0.01, rho=0.9, epsilon=None, decay=0.0)
model.compile(loss='categorical_crossentropy', optimizer=rms, metrics=['accuracy'])
网络A.
Shape of input matrix:
4 1
Shape of Output:
57
Layer (type) Output Shape Param #
=================================================================
lstm_3 (LSTM) (None, 4, 256) 264192
_________________________________________________________________
dropout_2 (Dropout) (None, 4, 256) 0
_________________________________________________________________
lstm_4 (LSTM) (None, 4, 128) 197120
_________________________________________________________________
dropout_3 (Dropout) (None, 4, 128) 0
_________________________________________________________________
lstm_5 (LSTM) (None, 32) 20608
_________________________________________________________________
dense_1 (Dense) (None, 128) 4224
_________________________________________________________________
dropout_4 (Dropout) (None, 128) 0
_________________________________________________________________
dense_2 (Dense) (None, 57) 7353
_________________________________________________________________
activation_1 (Activation) (None, 57) 0
=================================================================
Total params: 493,497
Trainable params: 493,497
Non-trainable params: 0
“网络B”
Shape of input matrix:
4 1
Shape of Output:
57
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_6 (LSTM) (None, 4, 32) 4352
_________________________________________________________________
dropout_5 (Dropout) (None, 4, 32) 0
_________________________________________________________________
lstm_7 (LSTM) (None, 16) 3136
_________________________________________________________________
dropout_6 (Dropout) (None, 16) 0
_________________________________________________________________
dense_3 (Dense) (None, 57) 969
_________________________________________________________________
activation_2 (Activation) (None, 57) 0
=================================================================
Total params: 8,457
Trainable params: 8,457
Non-trainable params: 0
我可以看到你的输入形状是“4x1”并且你直接将它输入到你的LSTM,输入的格式是什么?因为在这里似乎每个时间步(对于每个字符)你的维度为1(所以也许你只是传递了一个int?)。
正如您所说,您正在处理4个字符的序列,您必须将它们视为分类变量并以适当的方式对它们进行编码。
例如,你可以对它们进行单热编码,或者使用EmbeddingLayer
将它们嵌入到某个维度。