Python 文本预测问题LSTM神经网络
我正在尝试使用递归神经网络(LSTM)和来自书籍的数据集进行文本预测。无论我如何尝试改变图层大小或其他参数,它总是过盈 我一直在尝试更改层的数量、LSTM层中的单元数量、正则化、规范化、批量大小、洗牌训练数据/验证数据、将数据集更改为更大的数据集。目前,我尝试使用约140kb的txt书籍。我也试过200kb,1mb,5mb 创建培训/验证数据:Python 文本预测问题LSTM神经网络,python,tensorflow,machine-learning,keras,neural-network,Python,Tensorflow,Machine Learning,Keras,Neural Network,我正在尝试使用递归神经网络(LSTM)和来自书籍的数据集进行文本预测。无论我如何尝试改变图层大小或其他参数,它总是过盈 我一直在尝试更改层的数量、LSTM层中的单元数量、正则化、规范化、批量大小、洗牌训练数据/验证数据、将数据集更改为更大的数据集。目前,我尝试使用约140kb的txt书籍。我也试过200kb,1mb,5mb 创建培训/验证数据: sequence_length = 30 x_data = [] y_data = [] for i in range(0, len(text) -
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纪元停止?你也尝试过非常极端的正规化或辍学吗?而且,您的验证错误没有增加,因此您的网络不会变得更糟。您可能没有过度拟合,但可能只是提取了数据集中可用的尽可能多的知识。您的验证错误永远不会像您的培训错误那样好。你的图表显示,是的,它可能在训练中学习噪音,但这并不是以牺牲样本中更糟糕的模型为代价的。经典的过度拟合会显示蓝线开始向上弯曲(或向下弯曲以获得准确度);这将要求val损失开始增加(精度降低),这在这里显然不会发生(请参阅)。您的模型刚刚饱和,无法进一步学习(但也不会变得更糟)。此外,默认情况下不应使用辍学-这可能会导致。如果需要,我会在5点提前停止…如果你真的想提前30个小时停止,你可以降低学习速度或ESε,但这不会改变整体最终结果。ES适用于过度拟合和饱和(不知道确切的单词,但这一个非常清楚),因此无论什么情况都可以使用它。@michalovsky网络中有多少个参数?请参见model.summary()中的。您可以将堆叠LSTM的数量从3个减少到1个或2个。谢谢您的回答,我的应用程序是面向字符的,而不是文字,因此不需要嵌入。这就像x=50个字符的顺序,y=1个热标签和下一个字符,然后移动一个字符和下50个字符。我将尝试你描述的其他想法。