【发布时间】:2019-11-08 10:22:48
【问题描述】:
我正在尝试使用递归神经网络 (LSTM) 和书籍数据集进行文本预测。不管我尝试改变图层大小或其他参数多少,它总是过拟合。
我一直在尝试更改层数、LSTM 层中的单元数、正则化、归一化、batch_size、shuffle 训练数据/验证数据、将数据集更改为更大。现在我尝试使用 ~140kb txt 书。我也试过 200kb、1mb、5mb。
创建训练/验证数据:
sequence_length = 30
x_data = []
y_data = []
for i in range(0, len(text) - sequence_length, 1):
x_sequence = text[i:i + sequence_length]
y_label = text[i + sequence_length]
x_data.append([char2idx[char] for char in x_sequence])
y_data.append(char2idx[y_label])
X = np.reshape(x_data, (data_length, sequence_length, 1))
X = X/float(vocab_length)
y = np_utils.to_categorical(y_data)
# Split into training and testing set, shuffle data
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, shuffle=False)
# Shuffle testing set
X_test, y_test = shuffle(X_test, y_test, random_state=0)
创建模型:
model = Sequential()
model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2]), return_sequences=True, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(LSTM(256, return_sequences=True, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(LSTM(256, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(Dropout(0.2))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
我不知道如何处理这种过度拟合,因为我在网上搜索,尝试了很多东西,但似乎都没有效果。
我怎样才能获得更好的结果?这些预测现在似乎不太好。
【问题讨论】:
-
我不确定问题是什么但是如果你有足够的时代,模型总是过拟合。这就是为什么您要根据验证集提前停止。您可以尝试延迟过拟合、减少过拟合、分析过拟合,但您的模型总是介于过拟合和欠拟合之间(两者都发生在数据集的子集上)。
-
在 10 纪元提前停止?你也尝试过非常极端的正则化或辍学吗?而且,您的验证错误不会增加,因此您的网络不会变得更糟。您可能没有过度拟合,但可能只是提取了数据集中可用的尽可能多的知识。你的验证错误永远不会像你的训练错误那么好。您的图表显示,是的,它可能正在学习训练中的噪音,但这并不会以样本中更糟糕的模型为代价。经典的过拟合会显示蓝线开始向上弯曲(或向下弯曲以提高准确性)。
-
正如@Dan 正确暗示的那样,您没有过拟合;这将需要您的 val loss 开始增加(精度降低),这显然不会在这里发生(请参阅this thread)。您的模型刚刚饱和,无法进一步学习(但也不会变得更糟)。此外,默认情况下不应使用 dropout - 它可能导致performance degradation。
-
如果需要,我会在 5 点提前停止......如果你真的想提前 30 轮停止,你可以随时降低学习率或 ES epsilon,但它不会改变任何事情总体最终结果。 ES 适用于过拟合和饱和(不知道确切的词,但这个词很清楚),所以无论如何都使用它是一个好习惯。
-
@michalovsky 您的网络中有多少参数?请参阅 model.summary()。您可能应该将堆叠 LSTM 的数量从 3 个减少到 1 个或 2 个对您有用。
标签: python tensorflow machine-learning keras neural-network