《Python 深度学习》刷书笔记 Chapter 6 Part-3 利用Embedding层学习词嵌入
2021/10/11 17:14:35
本文主要是介绍《Python 深度学习》刷书笔记 Chapter 6 Part-3 利用Embedding层学习词嵌入,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 使用词嵌入层(Embedding 层)
- 利用Embedding层学习词嵌入
- 6-5 将一个Embedding层实例化
- 6-6 加载IMDB数据,准备用于Embedding层
- 6-7 在IMDB数据上使用Embedding层和分类器
- 写在最后
使用词嵌入层(Embedding 层)
将单词和向量关联还存在着一种强大的方法,就是使用更为密集的词向量(word vector),也叫词嵌入(word embedding),对比于one-hot编码如下:
密集度 | 维度 | 生成方法 | |
---|---|---|---|
One-hot | 稀疏 | 高维 | 硬编码 |
词嵌入 | 密集 | 低维 | 从数据中学习 |
获取词嵌入一般有以下两种方法:
- 完成主任务(在分类文档、情感预测)的同时嵌入
- 在不同于待解决问题的任务上通过预计算好词语再嵌入,又称为预训练词嵌入
利用Embedding层学习词嵌入
词嵌入的作用:将人类的语言映射到几何空间中,一般来说,任意两个词的几何距离应该和这两个词的语义距离有关
由于人类的语言种类、用法、场合、习惯都是动态变化的,不存在一套完美符合各种情况的词嵌入空间,因此,合理的做法应该是对每个新的任务都学习一个新的嵌入空间。在keras下,我们只需要学习一个层的权重,这个层就是Embedding层
6-5 将一个Embedding层实例化
from keras.layers import Embedding # Embedding 层至少需要两个参数 # 1. 标记的个数(最大的单词索引个数,这里是1000) # 2. 嵌入的维度(这里是64) embedding_layer = Embedding(1000, 64)
我们最好将Embedding层理解为一个字典,可以将整数索引映射为密集向量,工作方式如下:
- 它能够接收整数作为输入
- 内部字典中查找这些整数
- 返回相关联的向量
单词索引 --> 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,您的支持作者最大的创作动力哟!
<(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知
这篇关于《Python 深度学习》刷书笔记 Chapter 6 Part-3 利用Embedding层学习词嵌入的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门