参考《python深度学习》第六章第一节
IMDB电影评论二分类
背景知识
Embedding
本节关注:在Embedding层,使用预训练和从零开始训练的词嵌入对模型性能的影响。
Embedding层相当于一个字典,负责将词索引映射到固定尺寸的稠密词向量。它接受整数序列作为输入,返回对应的词向量。它只能作为模型的第一层。
输入是二维整数张量,形状是 samples * sequence_length,每个元素是一个整数序列。
输出是三维浮点数张量,形状是 samples * sequence_length * output_dim。
Embedding层的权重描述字典的准确度,就是使近义词映射到相似词向量的能力。
keras.layers.Embedding()的主要参数:
input_dim/batch_size/samples
字典的大小/词索引的数量
output_dim
词向量的维度
input_length/sequence_lenth
输入序列的长度,可选。如果你需要连接 Flatten 和 Dense 层,则这个参数是必须的(没有它,dense 层的输出尺寸就无法计算)。
IMDB数据集
IMDB数据集有5w条评论,其中2w5做训练集,剩下做测试集,每个部分正负评论各占50%。
影评已被预处理为词索引构成的序列。方便起见,单词的索引基于它在数据集中出现的频率,0不映射特定的词,用来表示所有未知单词。
模型实现
模型1(自训练词嵌入)
模型1只查看每条评论的前20个单词,embedding层的字典大小是10000,生成8维词向量。在embedding层之后,叠加一个flatten层展开二维张量,最后叠加Dense层进行分类。这里直接展开词嵌入,会导致同一评论中的每个单词被单独处理,丢弃了句子结构和单词组合的信息。更好的做法是embedding层之后训练一个循环层或者一维卷积层。
import keras
from keras.datasets import imdb
max_features = 10000 # 字典的大小
maxlen = 20 # 截取数据的长度
# 加载数据集
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
# 对齐序列,将整数列表转换为形状为(samples, maxlen)的二维整数张量
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)
# 模型初始化
from keras.layers import Flatten, Dense, Embedding
model = keras.Sequential() # 堆叠模型:堆叠层来构建网络
model.add(Embedding(10000, 8, input_length=maxlen)) # Embedding层:生成词嵌入
model.add(Flatten()) # Flatten层:二维化输出张量
model.add(Dense(1, activation='sigmoid')) # Dense层:分类
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc']) # loss对应sigmoid,评估指标是精度
model.summary() # 输出参数
# 模型训练
history = model.fit(x_train, y_train, epochs=10, batch_size=