博客
关于我
keras-文本序列_文本向量化(二)(利用 Embedding 层学习词嵌入)
阅读量:376 次
发布时间:2019-03-05

本文共 6308 字,大约阅读时间需要 21 分钟。

Keras-文本序列_文本向量化(二)(利用 Embedding 层学习词嵌入)

参考:
https://blog.csdn.net/qq_30614345/article/details/98714874

****1. 利用 Embedding 层学习词嵌入

代码清单 6-5 将一个 Embedding 层实例化
代码清单 6-6 加载 IMDB 数据,准备用于 Embedding 层

在真实的词嵌入空间中,常见的有意义的几何变换的例子包括“性别”向量和“复数”向量。

例如,将 king(国王)向量加上 female(女性)向量,得到的是 queen(女王)向量。将 king(国王)向量加上 plural(复数)向量,得到的是 kings 向量。词嵌入空间通常具有几千个这种可解释的、并且可能很有用的向量。
有没有一个理想的词嵌入空间,可以完美地映射人类语言,并可用于所有自然语言处理任务?可能有,但我们尚未发现。此外,也不存在人类语言(human language)这种东西。世界上a 两个词的中文含义都是“精确的”。 ——译者注6.1 处理文本数据  153
1 2 3 4 5 6 7 8 9
有许多种不同的语言,而且它们不是同构的,因为语言是特定文化和特定环境的反射。但从更实际的角度来说,一个好的词嵌入空间在很大程度上取决于你的任务。英语电影评论情感分析模型的完美词嵌入空间,可能不同于英语法律文档分类模型的完美词嵌入空间,因为某些语义关系的重要性因任务而异

import keraskeras.__version__# 在真实的词嵌入空间中,常见的有意义的几何变换的例子包括“性别”向量和“复数”向量。# 例如,将 king(国王)向量加上 female(女性)向量,得到的是 queen(女王)向量。将 king(国王)# 向量加上 plural(复数)向量,得到的是 kings 向量。词嵌入空间通常具有几千个这种可解释的、# 并且可能很有用的向量。# 有没有一个理想的词嵌入空间,可以完美地映射人类语言,并可用于所有自然语言处理任# 务?可能有,但我们尚未发现。此外,也不存在人类语言(human language)这种东西。世界上# 有许多种不同的语言,而且它们不是同构的,因为语言是特定文化和特定环境的反射。但从更# 实际的角度来说,一个好的词嵌入空间在很大程度上取决于你的任务。英语电影评论情感分析# 模型的完美词嵌入空间,可能不同于英语法律文档分类模型的完美词嵌入空间,因为某些语义# 关系的重要性因任务而异。# 因此,合理的做法是对每个新任务都学习一个新的嵌入空间。幸运的是,反向传播让这种# 学习变得很简单,而 Keras 使其变得更简单。我们要做的就是学习一个层的权重,这个层就是# Embedding 层。# 代码清单 6-5 将一个 Embedding 层实例化from keras.layers import Embedding# The Embedding layer takes at least two arguments:# the number of possible tokens, here 1000 (1 + maximum word index),# and the dimensionality of the embeddings, here 64.# Embedding 层至少需要两个参数:标记的个数(这里是 1000,即最大单词索引 +1)和嵌入的维度(这里是 64)# Embedding 层的输入是一个二维整数张量,其形状为 (samples, sequence_length),# 每个元素是一个整数序列。它能够嵌入长度可变的序列,例如,对于前一个例子中的# Embedding 层,你可以输入形状为 (32, 10)(32 个长度为 10 的序列组成的批量)或 (64,# 15)(64 个长度为 15 的序列组成的批量)的批量。不过一批数据中的所有序列必须具有相同的# 长度(因为需要将它们打包成一个张量),所以较短的序列应该用 0 填充,较长的序列应该被截断。# 这 个 Embedding 层 返 回 一 个 形 状 为 (samples, sequence_length, embedding_# dimensionality) 的三维浮点数张量。然后可以用 RNN 层或一维卷积层来处理这个三维张量# (二者都会在后面介绍)。# 将一个 Embedding 层实例化时,它的权重(即标记向量的内部字典)最开始是随机的,与# 其他层一样。在训练过程中,利用反向传播来逐渐调节这些词向量,改变空间结构以便下游模# 型可以利用。一旦训练完成,嵌入空间将会展示大量结构,这种结构专门针对训练模型所要解# 决的问题。embedding_layer = Embedding(1000, 64)# 将电影评论限制为前 10 000 个最常见的单词(第一次处理这个数据集时就是这么做的),# 然后将评论长度限制为只有 20 个单词。对于这 10 000 个单词,网络将对每个词都学习一个 8# 维嵌入,将输入的整数序列(二维整数张量)转换为嵌入序列(三维浮点数张量),然后将这个# 张量展平为二维,最后在上面训练一个 Dense 层用于分类。# Embedding 层至少需要两个参数:# 标记的个数(这里是 1000,即最# 大单词索引 +1)和嵌入的维度(这# 里是 64)154  第 6 章 深度学习用于文本和序列# 代码清单 6-6 加载 IMDB 数据,准备用于 Embedding 层from keras.datasets import imdbfrom keras import preprocessing# Number of words to consider as features# 作为特征的单词个数max_features = 10000# Cut texts after this number of words # (among top max_features most common words)# 在这么多单词后截断文本(这些单词都属于前 max_features 个最常见的单词)maxlen = 20# Load the data as lists of integers.# 将整数列表转换成形状为(samples,maxlen) 的二维整数张量(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)# This turns our lists of integers# into a 2D integer tensor of shape `(samples, maxlen)`x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz12460032/17464789 [====================>.........] - ETA: 0s# 代码清单 6-7 在 IMDB 数据上使用 Embedding 层和分类器​from keras.models import Sequentialfrom keras.layers import Flatten, Dense​model = Sequential()# We specify the maximum input length to our Embedding layer# so we can later flatten the embedded inputs​# 指定 Embedding 层的最大输入长度,以便后面将嵌入输入展平。 Embedding 层激活的形状为 (samples, maxlen, 8)​model.add(Embedding(10000, 8, input_length=maxlen))# After the Embedding layer, # our activations have shape `(samples, maxlen, 8)`.​# We flatten the 3D tensor of embeddings # into a 2D tensor of shape `(samples, maxlen * 8)`​# 将三维的嵌入张量展平成形状为 (samples, maxlen * 8) 的二维张量​model.add(Flatten())​# 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)​# 得到的验证精度约为 76%,考虑到仅查看每条评论的前 20 个单词,这个结果还是相当不错# 的。但请注意,仅仅将嵌入序列展开并在上面训练一个 Dense 层,会导致模型对输入序列中的# 每个单词单独处理,而没有考虑单词之间的关系和句子结构(举个例子,这个模型可能会将 this# movie is a bomb 和 this movie is the bomb 两条都归为负面评论 a)。更好的做法是在嵌入序列上添# 加循环层或一维卷积层,将每个序列作为整体来学习特征。这也是接下来几节的重点_________________________________________________________________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,161Trainable params: 80,161Non-trainable params: 0_________________________________________________________________Train on 20000 samples, validate on 5000 samplesEpoch 1/1020000/20000 [==============================] - 2s - loss: 0.6560 - acc: 0.6482 - val_loss: 0.5906 - val_acc: 0.7146Epoch 2/1020000/20000 [==============================] - 2s - loss: 0.5189 - acc: 0.7595 - val_loss: 0.5117 - val_acc: 0.7364Epoch 3/1020000/20000 [==============================] - 2s - loss: 0.4512 - acc: 0.7933 - val_loss: 0.4949 - val_acc: 0.7470Epoch 4/1020000/20000 [==============================] - 2s - loss: 0.4190 - acc: 0.8069 - val_loss: 0.4905 - val_acc: 0.7538Epoch 5/1020000/20000 [==============================] - 2s - loss: 0.3965 - acc: 0.8198 - val_loss: 0.4914 - val_acc: 0.7572Epoch 6/1020000/20000 [==============================] - 2s - loss: 0.3784 - acc: 0.8311 - val_loss: 0.4953 - val_acc: 0.7594Epoch 7/1020000/20000 [==============================] - 2s - loss: 0.3624 - acc: 0.8419 - val_loss: 0.5004 - val_acc: 0.7574Epoch 8/1020000/20000 [==============================] - 2s - loss: 0.3474 - acc: 0.8484 - val_loss: 0.5058 - val_acc: 0.7572Epoch 9/1020000/20000 [==============================] - 2s - loss: 0.3330 - acc: 0.8582 - val_loss: 0.5122 - val_acc: 0.7528Epoch 10/1020000/20000 [==============================] - 2s - loss: 0.3194 - acc: 0.8669 - val_loss: 0.5183 - val_acc: 0.7554
你可能感兴趣的文章
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>