Keras方法进行词嵌入

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Einstellung/article/details/82890935

Embedding层实例化

from keras.layers import Embedding

embedding_layer = Embedding(1000, 64)

我们将词嵌入的办法用于IMDB电影评论情感预测任务学习。对于电影数据集,我们将评论限制为前10000个最常见的单词,然后将评论限制为只有20个单词。对于这10000个单词,网络对每个单词都学习一个8维词嵌入,然后输入的整数序列(二维整数张量)转换为嵌入序列(三维浮点数张量),然后将这个张量展平为二维,最后在上面训练一个Dense层用于分类。

from keras.datasets import imdb
from keras import preprocessing

max_features = 10000   # 作为特征的单词个数

maxlen = 20   # 在这么多单词之后截断文本(这些单词属于前max_features个最常见的单词)


(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)   # 将数据加载为整数列表

x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)   #将整数列表转换为形状为(samples, maxlen)的二维整数张量
x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)

在IMDB数据集上使用Embedding层和分类器

from keras.models import Sequential
from keras.layers import Flatten, Dense

model = Sequential()

model.add(Embedding(10000, 8, input_length=maxlen))  #指定Embedding层的最大输入长度,以便后面将嵌入输入展平,Embedding层激活形状为(samples, maxlen, 8)

model.add(Flatten())  #将三维的嵌入张量展平成形状为(samples, maxlen*8)

# We add the classifier on top
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
model.summary()

history = model.fit(x_train, y_train,
                    epochs=10,
                    batch_size=32,
                    validation_split=0.2)
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_2 (Embedding)      (None, 20, 8)             80000     
_________________________________________________________________
flatten_1 (Flatten)          (None, 160)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 161       
=================================================================
Total params: 80,161
Trainable params: 80,161
Non-trainable params: 0
_________________________________________________________________
Train on 20000 samples, validate on 5000 samples

最后得到精度是76%,考虑到仅看每条评论的前20个单词,这个结果还是相当不错的。但请注意,仅仅将嵌入序列展开并在上面训练一个Dense层,会导致模型对输入序列中的每个单词单独处理,而没有考虑单词之间关系句子结构。更好的做法是在嵌入序列中添加循环层和一维卷积层,将每个序列作为整体来学习特征。

更多精彩内容,欢迎关注我的微信公众号:数据瞎分析
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Einstellung/article/details/82890935