无法通过LSTM算法中的记录处理跟踪记录以进行文本分类?

时间:2019-03-08 09:46:56

标签: tensorflow keras deep-learning lstm word2vec

我们正在努力进行多类文本分类,以下是我们使用的过程。

1)我们使用自己的数据通过word2vec词嵌入创建了300个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 dim's)作为权重?

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

Q3)您能解释一下LSTM算法中的单记录处理吗?

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

1 个答案:

答案 0 :(得分:1)

  

Q1)为什么我们将单词嵌入向量(300 dim's)作为权重传递给   LSTM嵌入层?

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

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)