gpt4 book ai didi

python - RNN 不会对简单数据过度拟合

转载 作者:行者123 更新时间:2023-11-30 09:00:25 25 4
gpt4 key购买 nike

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

在第二个纪元之后,精度停留在 0.8824。更高数量的训练纪元不会改变任何东西。我尝试将 LSTM 切换为 GRU 或 SimpleRNN,但这没有任何改变。我还尝试生成更长的输入向量和多个批处理,但没有成功。

唯一有帮助的是将 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

最佳答案

您可以看出出现了问题,因为您的代码的损失值在第一个纪元之后为 NaN。这个问题是一个常见问题,过去不止一次困扰过我,那就是 fit 方法采用默认为 32 的 batch_size 参数。因为你只有举个例子,你甚至无法填充一批,这种情况显然是 Keras 没有检测到的,但会导致错误的损失计算。所以你只需要将其更改为:

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

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

关于python - RNN 不会对简单数据过度拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41977498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com