首页 文章

LSTM如何使用单词嵌入进行文本分类,例如Keras

提问于
浏览
0

我试图理解LSTM如何用于分类文本句子(单词序列)包括预先训练的单词嵌入 . 我正在阅读有关lstm的一些帖子,我对详细程序感到困惑:

在keras上使用LSTM进行IMDB分类:https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/ Colah对LSTM的解释:http://colah.github.io/posts/2015-08-Understanding-LSTMs/

比方说,我想用lstm来分类电影评论,每篇评论都有固定长度的500字 . 我正在使用预训练的文字嵌入(来自fasttext),为每个单词提供100维向量 . Xt的尺寸是什么才能进入LSTM? LSTM是如何训练的?如果每个Xt是100维向量代表评论中的一个单词,我是否一次将评论中的每个单词提供给LSTM? LSTM在每个时代都会做些什么?我真的很困惑......

lstm cell from Colah's blog

# LSTM for sequence classification in the IMDB dataset
import numpy
from keras.datasets import imdb
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
# fix random seed for reproducibility
numpy.random.seed(7)
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# truncate and pad input sequences
max_review_length = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
# create the model
embedding_vecor_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, epochs=3, batch_size=64)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

在上面的代码示例中(取自Jason Brownlee的博客https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neural-networks-python-keras/),使用了100个细胞/神经元的LSTM . 100个神经元如何相互连接?为什么我不能只使用上图中的1个单元格进行分类,因为它是一种循环方式,因此它会在下一个时间戳中将输出反馈给自己?任何可视化图表都将受到欢迎 .

谢谢!!

2 回答

  • 3

    Shapes with the embedding:

    • 输入数据的形状: X_train.shape == (reviews, words) ,这是 (reviews, 500)

    In the LSTM (after the embedding, or if you didn't have an embedding)

    • 输入数据的形状: (reviews, words, embedding_size)

    • (reviews, 500, 100) - 其中100是由嵌入自动创建的

    • 模型的输入形状(如果没有嵌入层)可以是:

    • input_shape = (500, 100)

    • input_shape = (None, 100) - 此选项支持可变长度评论

    • 每个 Xt 是来自 input_data[:,timestep,:] 的切片,其形状为:

    • (reviews, 100)

    • 但这完全是自动的,由图层本身制作 .

    • 每个 Ht 都被丢弃,结果只是最后一个 h ,因为你没有使用 return_sequences=True (但这对你的模型来说没问题) .

    您的代码似乎正在执行所有操作,因此您无需执行任何特殊操作来训练此模型 . 将 fit 与正确的 X_train 一起使用,您将得到形状为 (reviews,1)y_train .

    Questions:

    如果每个Xt是100维向量代表评论中的一个单词,我是否一次将评论中的每个单词提供给LSTM?

    不,LSTM层已经完成了所有事情,包括所有重复步骤,只要它的输入具有形状 (reviews, words, embedding_size)


    100个神经元如何相互连接?

    它们有点平行(你可以想象100个图像,如你发布的图像,全部是平行的),几乎与其他类型的常用图层相同 .

    但是在经常性的步骤中,有一种可以让他们进行对话的材料表达(遗憾的是我无法解释如何) .


    为什么我不能只使用上图中的1个单元格进行分类,因为它是一种循环方式,因此它会在下一个时间戳中将输出反馈给自身?

    如果你愿意,你可以,但是更多的单元格,更聪明的层(与其他类型的层一样)

    选择的数字100没有什么特别之处 . 这可能是巧合或误解 . 它可以是任意数量,50个细胞,200个细胞,1000个细胞......


    Understanding LSTMs deeply:

  • 3

    你混淆了一些术语,让我们试着澄清一步一步的进展:

    • 您案例中的数据将成形(样本,500),这意味着我们有一些评论,每个评论最多500个字编码为整数 .

    • 然后,如果嵌入大小为100,则每个样本中的每个单词的 Embedding 层都会返回 words[index] 给出张量(样本,500,100) .

    • 现在这里是令人困惑的位,当我们说 LSTM(100) 时,它意味着一个层运行单个LSTM单元格(一个像Colah的图中一样),每个单词的输出大小为100.让我再试一次,你创建一个单独的LSTM单元将输入转换为100大小的输出(隐藏大小),并且该层在单词上运行相同的单元格 .

    • 现在我们获得(样本,100),因为相同的LSTM处理500个单词的每个评论并返回大小为100的最终输出 . 例如,我们传递 return_sequences=True 然后每个隐藏的输出,h-1,h,h 1 in图表将被返回,因此我们将获得一个形状(样本,500,100) .

    • 最后,我们将(样本,100)传递给 Dense 层进行预测,给出(样本,1)所以a预测批次中的每个评论 .

    拿走课程的是 LSTM 层围绕一个LSTMCell并在每个时间步长运行它,因此您不必自己编写循环操作 .

相关问题