RNN不会过度拟合简单数据

时间:2017-02-01 10:34:02

标签: python machine-learning neural-network keras recurrent-neural-network

我正在尝试为输入向量中的每个数字预测类。有3个班级。 Class 1,如果输入值从0变为1. Class 2,如果它从1变为0.否则为Class 0。

在第二个纪元之后,准确性被停留在0.8824。更高数量的训练时代不会改变任何事情。我尝试将LSTM切换为GRUSimpleRNN,但这没有任何改变。我还尝试生成更长的输入向量和多个批次,同样没有成功。

唯一有帮助的是将LSTM图层的大小增加到128,在每个图层(包括LSTM)之后添加三个TimeDistributedDense(128, relu)图层和BatchNormalization。但是对于这样一个简单的问题来说看起来有些过分,而且无论如何都没有给出完美的结果。

我花了一天多的时间试图让它发挥作用。可能有什么问题? 谢谢!

# complete code for training
from keras.models import Sequential
from keras.layers import Dense, LSTM, TimeDistributed
from keras.utils.np_utils import to_categorical
import numpy as np

np.random.seed(1337)

X = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0])
Y = np.array([0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0])
Y_cat = to_categorical(Y, 3).reshape((1, len(X), 3))
X_r = X.reshape((1, len(X), 1))

model = Sequential()
model.add(LSTM(32, input_dim=1, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(TimeDistributed(Dense(3, activation='softmax')))

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

model.fit(X_r, Y_cat, nb_epoch=10)

model.predict_classes(X_r) # will print array filled with zeros

1 个答案:

答案 0 :(得分:2)

你可以说出错了,因为你的代码的损失值在第一个纪元后是NaN。问题是一个常见的问题,过去曾经多次咬过我,这就是fit方法采用默认为32的batch_size参数。因为你只有一个例子,你甚至无法填写一批,一种显然未被Keras检测到但会导致错误计算的情况。所以你只需将其改为:

model.fit(X_r, Y_cat, nb_epoch=10, batch_size=1)

但是,可能需要花费一些精力来拟合这些数据。神经网络很难使用单个特征(如果输入是单热编码则可能更容易)并且数据很小。此外,网越大/越深,装配重量所需的越多(即使它应该更强大)。但至少现在你将能够看到损失如何减少。我已经能够通过你的例子去除第二和第三个LSTM层以及大约250个时期的训练达到100%的准确度(当然,如果你有更多和更长的例子,这个数字肯定会更小)。