无法通过在LSTM算法中进行记录来跟踪记录以进行文本分类



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

1)我们使用我们自己的数据嵌入Word2Vec Word的300个DIM的向量

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)为什么我们将单词嵌入向量(300 dim)作为LSTM嵌入层中的权重?

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

Q3)您能说明LSTM算法中的单个记录处理如何?

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

Q1)为什么我们将嵌入向量(300 dim)作为权重的词 LSTM嵌入层?

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

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

所以你在这里

  • 创建一个可以查找单词的嵌入层或查找表索引0到len(word_index)。
  • 每个查找的单词都会映射到300尺寸的向量。
  • 此查找表装有来自" embedding_matrix"的向量(这是一个验证的模型)。
  • 训练= false将冻结此层中的重量。

您已经通过了300,因为它是验证型号的矢量大小(embedding_matrix)

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

您已经创建了一个带有300个尺寸向量的LSTM层作为输入,并返回一个尺寸300的向量。输出大小和堆叠LSTM的数量是手动调整的超参数(通常使用kfold cv)

Q3)您能说明LSTM中的单个记录处理如何 算法?

  • 单个记录/句子被转换为词汇的索引。因此,对于每个句子,您都有一系列索引。
  • 创建了一批这些句子,并作为模型输入输入。
  • LSTM通过一次在每个时间段的输入时通过一个索引来解开。
  • 最后,LSTM的Ouput被最终密集传播图层至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)

相关内容

  • 没有找到相关文章

最新更新