ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-10-11 15:59:54  阅读:216  来源: 互联网

标签:Chapter 刷书 嵌入 val loss Python Embedding 20000 acc


文章目录


使用词嵌入层(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,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

标签:Chapter,刷书,嵌入,val,loss,Python,Embedding,20000,acc
来源: https://blog.csdn.net/LeungSr/article/details/120704905

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有