一、总结
一句话总结:
【考虑到仅查看每条评论的前 20 个单词】:得到的验证精度约为 76%,考虑到仅查看每条评论的前 20 个单词,这个结果还是相当不错 的。
【没有考虑单词之间的关系和句子结构】:但请注意,仅仅将嵌入序列展开并在上面训练一个 Dense 层,会导致模型对输入序列中的 每个单词单独处理,而没有考虑单词之间的关系和句子结构(举个例子,这个模型可能会将 this movie is a bomb和this movie is the bomb两条都归为负面评论)。
【添加循环层或一维卷积层】:更好的做法是在嵌入序列上添 加循环层或一维卷积层,将每个序列作为整体来学习特征。
model.add(Embedding(10000, 8, input_length=maxlen))
from tensorflow.keras.models import Sequential from tensorflow.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)` 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)
1、Embedding 层理解?
【字典:Embedding层实际上是一种字典查找】:最好将 Embedding 层理解为一个字典,将整数索引(表示特定单词)映射为密集向量。它 接收整数作为输入,并在内部字典中查找这些整数,然后返回相关联的向量。Embedding 层实 际上是一种字典查找
【单词索引-->Embedding层-->对应的词向量】
2、Embedding 层的输入?
【二维整数张量:(samples, sequence_length)】:Embedding 层的输入是一个二维整数张量,其形状为 (samples, sequence_length), 每个元素是一个整数序列。
【(32, 10)(32 个长度为10 的序列组成的批量)】:它能够嵌入长度可变的序列,例如,对于前一个例子中的 Embedding 层,你可以输入形状为 (32, 10)(32 个长度为10 的序列组成的批量)或 (64, 15)(64 个长度为15 的序列组成的批量)的批量。
【不够0填充,较长被截断】:不过一批数据中的所有序列必须具有相同的 长度(因为需要将它们打包成一个张量),所以较短的序列应该用 0 填充,较长的序列应该被截断。
3、Embedding 层 输出?
【也就是在原来的基础上扩充了embedding_dimensionality维】:【(samples, sequence_length, embedding_dimensionality)的三维浮点数张量】:这个Embedding 层返回一个形状为(samples, sequence_length, embedding_ dimensionality) 的三维浮点数张量。然后可以用 RNN 层或一维卷积层来处理这个三维张量
4、IMDB 电影评论情感预测任务 word Embedding 层 实例?
【限制为前10 000 个最常见的单词】:首先,我们需要快速准备 数据。将电影评论限制为前10 000 个最常见的单词(第一次处理这个数据集时就是这么做的), 然后将评论长度限制为只有20 个单词。
【将输入的整数序列(二维整数张量)转换为嵌入序列(三维浮点数张量),然后将这个张量展平为二维】:对于这10 000 个单词,网络将对每个词都学习一个8 维嵌入,将输入的整数序列(二维整数张量)转换为嵌入序列(三维浮点数张量),然后将这个 张量展平为二维,最后在上面训练一个 Dense 层用于分类。
二、word embedding-利用 Embedding 层学习词嵌入
博客对应课程的视频位置:
1、将一个 Embedding 层实例化
from tensorflow.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_layer = Embedding(1000, 64)
print(embedding_layer)
print(dir(embedding_layer))
2、加载 IMDB 数据,准备用于 Embedding 层
from tensorflow.keras.datasets import imdb
from tensorflow.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)
maxlen = 20
# 将数据加载为整数列表
# Load the data as lists of integers.
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
print(x_train.shape)
print(x_test.shape)
print(x_train[0])
print(x_train[1])
print(x_train)
为什么输入是25000,因为这里是25000个list,numpy肯定统计不了list的形状
从结果看好像是截断操作
# 将整数列表转换成形状为(samples,maxlen)的二维整数张量
# 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)
print(x_train.shape)
print(x_test.shape)
print(x_train[0])
print(x_train[1])
print(x_train)
从结果看好像是截断操作
3、在 IMDB 数据上使用 Embedding 层和分类器
from tensorflow.keras.models import Sequential
from tensorflow.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)`
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)。更好的做法是在嵌入序列上添 加循环层或一维卷积层,将每个序列作为整体来学习特征。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:《python深度学习》笔记—6.1-2、word embedding-利用 Embedding 层学习词嵌入 - Python技术站