【问题标题】:RNN is not overfitting on simple dataRNN 不会过度拟合简单数据
【发布时间】:2017-02-01 10:34:01
【问题描述】:

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

在第二个 epoch 和之后的精度停留在 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

【问题讨论】:

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


    【解决方案1】:

    您可以判断出问题所在,因为您的代码在第一个 epoch 之后的损失值是 NaN。问题是过去不止一次困扰我的一个常见问题,即 fit 方法采用默认为 32 的 batch_size 参数。由于您只有一个示例,您甚至无法填充一批,a Keras 显然没有检测到但会导致错误计算损失的情况。所以你只需要把它改成:

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

    不过,要适应这些数据可能需要付出一些努力。神经网络很难处理单个特征(如果输入是单热编码可能会更容易)并且数据很小。此外,网越大/越深,适应权重所需的时间就越多(即使它应该更强大)。但至少现在您将能够看到损失如何减少。通过您的示例移除第二和第三个 LSTM 层并训练大约 250 个时期,我已经能够达到 100% 的准确率(当然,如果您有更多和更长的示例,数量肯定会更小)。

    【讨论】:

    • 谢谢!尽管我在任何时期都没有 NaN,但删除两个 LSTM 层并训练 250 个时期确实有帮助。
    • 另外,我发现使用 Adam(lr=0.05) 优化器可以在大约 30 个 epoch 内进行完全训练。
    • @SSS 对,我现在看到的是 Keras 1.2.0 而不是最新的 1.2.1。更新后 NaN 不存在了,所以我猜这个问题在较新的版本中得到了解决。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 2018-12-28
    • 2019-09-18
    • 2019-08-09
    • 2020-03-16
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多