首页 > 解决方案 > 无法通过 LSTM 算法中的记录处理来跟踪记录以进行文本分类?

问题描述

我们正在研究多类文本分类,以下是我们使用的过程。

1)我们使用我们自己的数据创建了 300 个带有 word2vec 词嵌入的 dim 向量,然后将该向量作为权重传递给 LSTM 嵌入层。

2)然后我们使用了一层 LSTM 层和一层密集层。

下面是我的代码:

input_layer = layers.Input((train_seq_x.shape[1], ))

embedding_layer = layers.Embedding(len(word_index)+1, 300, weights=[embedding_matrix], trainable=False)(input_layer)
embedding_layer = layers.SpatialDropout1D(0.3)(embedding_layer)

lstm_layer1 = layers.LSTM(300,return_sequences=True,activation="relu")(embedding_layer)
lstm_layer1 = layers.Dropout(0.5)(lstm_layer1)

flat_layer = layers.Flatten()(lstm_layer1)

output_layer = layers.Dense(33, activation="sigmoid")(flat_layer)

model = models.Model(inputs=input_layer, outputs=output_layer)
model.compile(optimizer=optimizers.Adam(), loss='categorical_crossentropy',metrics=['accuracy'])

请帮助我解决以下问题:

Q1) 为什么我们在 LSTM 嵌入层中将词嵌入向量(300 点)作为权重传递?

Q2)我们如何知道 LSTM 层中的最佳神经数量?

Q3) 你能解释一下 LSTM 算法中的单条记录是如何处理的吗?

如果您需要更多信息,请告诉我。

标签: tensorflowkerasdeep-learninglstmword2vec

解决方案


Q1) 为什么我们在 LSTM 嵌入层中将词嵌入向量(300 点)作为权重传递?

以一种非常简单的方式,您可以将嵌入层视为将单词(由其在字典中的索引表示)转换为向量的查找表。它是可训练的层。由于您已经训练了词嵌入而不是使用随机权重初始化嵌入层,因此您使用所学的向量对其进行初始化。

Embedding(len(word_index)+1, 300, weights=[embedding_matrix], trainable=False)(input_layer)

所以你在这里

  • 创建一个嵌入层或查找表,它可以查找单词索引 0 到 len(word_index)。
  • 每个查找到的单词都会映射到一个大小为 300 的向量。
  • 这个查找表加载了来自“embedding_matrix”(这是一个预训练模型)的向量。
  • trainable=False 将冻结这一层的权重。

您已通过 300,因为它是您的预训练模型 (embedding_matrix) 的向量大小

Q2)我们如何知道 LSTM 层中的最佳神经数量?

您已经创建了一个 LSTM 层,其将 300 大小的向量作为输入并返回一个大小为 300 的向量。堆叠 LSTMS 的输出大小和数量是手动调整的超参数(通常使用 KFold CV)

Q3) 你能解释一下 LSTM 算法中的单条记录是如何处理的吗?

  • 单个记录/句子被转换为词汇表的索引。因此,对于每个句子,您都有一个索引数组。
  • 创建一批这些句子并将其作为输入提供给模型。
  • LSTM 通过在每个时间步中一次传入一个索引作为输入来展开。
  • 最后,LSTM 的输出由最终的密集层前向传播到大小 33。因此,在您的情况下,看起来每个输入都映射到 33 个类之一。

简单的例子

import numpy as np
from keras.preprocessing.text import one_hot
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten, LSTM
from keras.layers.embeddings import Embedding
from nltk.lm import Vocabulary
from keras.utils import to_categorical
training_data = [ "it was a good movie".split(), "it was a bad movie".split()]
training_target = [1, 0]
v = Vocabulary([word for s in training_data for word in s])
model = Sequential()
model.add(Embedding(len(v),50,input_length = 5, dropout = 0.2))
model.add(LSTM(10, dropout_U = 0.2, dropout_W = 0.2))
model.add(Dense(2,activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['accuracy'])
print(model.summary())
x = np.array([list(map(lambda x: v[x], s)) for s in training_data])
y = to_categorical(training_target)
model.fit(x,y)


推荐阅读