版权声明:本文为博主原创文章,未经博主允许不得转载。 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层,会导致模型对输入序列中的每个单词单独处理,而没有考虑单词之间关系句子结构。更好的做法是在嵌入序列中添加循环层和一维卷积层,将每个序列作为整体来学习特征。
更多精彩内容,欢迎关注我的微信公众号:数据瞎分析