Python 文本预测问题LSTM神经网络

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) -

我正在尝试使用递归神经网络(LSTM)和来自书籍的数据集进行文本预测。无论我如何尝试改变图层大小或其他参数,它总是过盈

我一直在尝试更改层的数量、LSTM层中的单元数量、正则化、规范化、批量大小、洗牌训练数据/验证数据、将数据集更改为更大的数据集。目前,我尝试使用约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'])
我有以下特点:

我不知道该怎么办,因为我在网上搜索,尝试了很多东西,但似乎都不管用


我怎样才能得到更好的结果?这些预测现在似乎不太好。

以下是我下一步要尝试的一些东西。 (我也是业余爱好者,如果我错了,请纠正我)

  • 试着从课文中摘录。试试word2vec、GloVe、FastText、ELMo。提取向量表示,然后将它们输入网络。您还可以创建一个用于帮助解决此问题的。这有更多的信息
  • 256个经常性单位可能太多了。我认为一个人不应该从一个庞大的网络开始。从小处做起。看看你是否不合身。如果是的话,那就大一点
  • 关闭优化器。我发现亚当有过度肥胖的倾向。我在rmsprop和Adadelta方面取得了更好的成功
  • 也许,《变形金刚》最近为NLP做出了巨大贡献。也许你可以在你的人际网络中试试。如果你还不熟悉,这里有一个例子。上面有一张照片
  • CNN也在NLP应用中。尽管它们在直觉上对文本数据没有任何意义(对大多数人来说)。也许你可以试着利用它们,把它们叠起来,等等。到处玩。下面是一篇关于如何使用它进行句子分类的文章。我知道,你的领域是不同的。但我认为直觉会延续下去。:)
    我不确定问题是什么,但如果你有足够的时间,模型总是过拟合。这就是为什么要根据验证集提前停止。您可以尝试延迟过拟合,减少过拟合,分析过拟合,但您的模型将始终介于过拟合和欠拟合之间(两者都发生在数据集的子集上)。提前在第10纪元停止?你也尝试过非常极端的正规化或辍学吗?而且,您的验证错误没有增加,因此您的网络不会变得更糟。您可能没有过度拟合,但可能只是提取了数据集中可用的尽可能多的知识。您的验证错误永远不会像您的培训错误那样好。你的图表显示,是的,它可能在训练中学习噪音,但这并不是以牺牲样本中更糟糕的模型为代价的。经典的过度拟合会显示蓝线开始向上弯曲(或向下弯曲以获得准确度);这将要求val损失开始增加(精度降低),这在这里显然不会发生(请参阅)。您的模型刚刚饱和,无法进一步学习(但也不会变得更糟)。此外,默认情况下不应使用辍学-这可能会导致。如果需要,我会在5点提前停止…如果你真的想提前30个小时停止,你可以降低学习速度或ESε,但这不会改变整体最终结果。ES适用于过度拟合和饱和(不知道确切的单词,但这一个非常清楚),因此无论什么情况都可以使用它。@michalovsky网络中有多少个参数?请参见model.summary()中的。您可以将堆叠LSTM的数量从3个减少到1个或2个。谢谢您的回答,我的应用程序是面向字符的,而不是文字,因此不需要嵌入。这就像x=50个字符的顺序,y=1个热标签和下一个字符,然后移动一个字符和下50个字符。我将尝试你描述的其他想法。