tensorflow - 无法通过 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 算法中的单条记录是如何处理的吗?
如果您需要更多信息,请告诉我。
解决方案
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)
推荐阅读
- python - flask wtforms QuerySelectFeld form.populate_obj 字段未填充,如果填写错误翻译引发
- django - 使用嵌套序列化程序时避免嵌套对象
- javascript - 使用 Django 为 AJAX 提取多个 HTML DOM 元素时遇到问题
- powershell - BufferCell 属性只读?
- netcdf - xarray to_netcdf 不是 netCDF
- java - WebElement.SendKeys(路径)问题:org.openqa.selenium.InvalidArgumentException:无效参数:找不到文件
- c - 检查两个文件是否相同
- c# - 添加孩子时xamarin滚动视图跳跃
- python - 传递给 Ordered Dict 创建的列表理解被创建为参考
- linux - 在 bash 脚本中调用 SSH Sudo 命令