《Python 深度学习》刷书笔记 Chapter 6 Part-3 利用Embedding层学习词嵌入

文章目录


使用词嵌入层(Embedding 层)


将单词和向量关联还存在着一种强大的方法,就是使用更为密集的词向量(word vector),也叫词嵌入(word embedding),对比于one-hot编码如下:

密集度 维度 生成方法
One-hot 稀疏 高维 硬编码
词嵌入 密集 低维 从数据中学习

获取词嵌入一般有以下两种方法:

  1. 完成主任务(在分类文档、情感预测)的同时嵌入
  2. 在不同于待解决问题的任务上通过预计算好词语再嵌入,又称为预训练词嵌入

利用Embedding层学习词嵌入

词嵌入的作用:将人类的语言映射到几何空间中,一般来说,任意两个词的几何距离应该和这两个词的语义距离有关

由于人类的语言种类、用法、场合、习惯都是动态变化的,不存在一套完美符合各种情况的词嵌入空间,因此,合理的做法应该是对每个新的任务都学习一个新的嵌入空间。在keras下,我们只需要学习一个层的权重,这个层就是Embedding层

6-5 将一个Embedding层实例化


from keras.layers import Embedding

# Embedding 层至少需要两个参数
# 1. 标记的个数(最大的单词索引个数,这里是1000)
# 2. 嵌入的维度(这里是64)
embedding_layer = Embedding(1000, 64)

我们最好将Embedding层理解为一个字典,可以将整数索引映射为密集向量,工作方式如下:

  1. 它能够接收整数作为输入
  2. 内部字典中查找这些整数
  3. 返回相关联的向量

单词索引 --> Embedding层 --> 对应的词向量

Embedding层输入的是一个二维整数张量(samples, sequence_length)

6-6 加载IMDB数据,准备用于Embedding层


from keras.datasets import imdb
from keras import preprocessing 
# 特征单词个数
max_features = 10000
# 设置最长长度截断文本
maxlen = 20

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

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

6-7 在IMDB数据上使用Embedding层和分类器


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

# 指定Embedding层的最大输入长度,将其激活形状为(samples, maxlen, 8)
model = Sequential()
model.add(Embedding(10000, 8, input_length = maxlen))

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

# 在上面添加分类器
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)
Model: "sequential_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
_________________________________________________________________


E:\develop_tools\Anaconda\envs\py36\lib\site-packages\tensorflow_core\python\framework\indexed_slices.py:424: UserWarning: Converting sparse IndexedSlices to a dense Tensor of unknown shape. This may consume a large amount of memory.
  "Converting sparse IndexedSlices to a dense Tensor of unknown shape. "


Train on 20000 samples, validate on 5000 samples
Epoch 1/10
20000/20000 [==============================] - 2s 78us/step - loss: 0.6661 - acc: 0.6259 - val_loss: 0.6135 - val_acc: 0.7044
Epoch 2/10
20000/20000 [==============================] - 1s 40us/step - loss: 0.5379 - acc: 0.7553 - val_loss: 0.5247 - val_acc: 0.7342
Epoch 3/10
20000/20000 [==============================] - 1s 41us/step - loss: 0.4588 - acc: 0.7891 - val_loss: 0.5000 - val_acc: 0.7470
Epoch 4/10
20000/20000 [==============================] - 1s 43us/step - loss: 0.4188 - acc: 0.8091 - val_loss: 0.4935 - val_acc: 0.7530
Epoch 5/10
20000/20000 [==============================] - 1s 41us/step - loss: 0.3910 - acc: 0.8257 - val_loss: 0.4961 - val_acc: 0.7580
Epoch 6/10
20000/20000 [==============================] - 1s 41us/step - loss: 0.3691 - acc: 0.8393 - val_loss: 0.5011 - val_acc: 0.7588
Epoch 7/10
20000/20000 [==============================] - 1s 43us/step - loss: 0.3499 - acc: 0.8509 - val_loss: 0.5084 - val_acc: 0.7580
Epoch 8/10
20000/20000 [==============================] - 1s 49us/step - loss: 0.3318 - acc: 0.8611 - val_loss: 0.5140 - val_acc: 0.7514
Epoch 9/10
20000/20000 [==============================] - 1s 40us/step - loss: 0.3149 - acc: 0.8694 - val_loss: 0.5246 - val_acc: 0.7496
Epoch 10/10
20000/20000 [==============================] - 1s 42us/step - loss: 0.2994 - acc: 0.8799 - val_loss: 0.5329 - val_acc: 0.7490

写在最后

注:本文代码来自《Python 深度学习》,做成电子笔记的方式上传,仅供学习参考,作者均已运行成功,如有遗漏请练习本文作者

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

上一篇:《实战Java高并发程序设计》食用指南V1.0


下一篇:【Beyond Feelings】【第六周】 CHAPTER 3 What Is Evidence? 部分个人理解