博客
关于我
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学习总结(74)——慢SQL!压垮团队的最后一根稻草!
查看>>
Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
Mysql学习笔记 - 在Centos7环境下离线安装Mysql
查看>>
MySQL学习笔记十七:复制特性
查看>>
Mysql学习第一课-mysql的定义及sql语句
查看>>
mysql安全模式: sql_safe_updates
查看>>
mysql安装,卸载,连接
查看>>