3、处理数据
由于评论长度不一致,所以在输入神经网络前必须将电影评论长度统一化,接一下将用到Keras.preprocessing.sequence.pad_sequences函数来使长度标准化。
train_data = keras.preprocessing.sequence.pad_sequences(train_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
test_data = keras.preprocessing.sequence.pad_sequences(test_data,
value=word_index["<PAD>"],
padding='post',
maxlen=256)
#查看样本长度
print(len(train_data[0]), len(train_data[1]))
#检查第一条数据(当前是否已经填充)
print(train_data[0])
打印结果:
256 256
[23022 309 6 3 1069 209 9 2175 30 1 169 55
14 46 82 5869 41 393 110 138 14 5359 58 4477
150 8 1 5032 5948 482 69 5 261 12 23022 73935
2003 6 73 2436 5 632 71 6 5359 1 25279 5
2004 10471 1 5941 1534 34 67 64 205 140 65 1232
63526 21145 1 49265 4 1 223 901 29 3024 69 4
1 5863 10 694 2 65 1534 51 10 216 1 387
8 60 3 1472 3724 802 5 3521 177 1 393 10
1238 14030 30 309 3 353 344 2989 143 130 5 7804
28 4 126 5359 1472 2375 5 23022 309 10 532 12
108 1470 4 58 556 101 12 23022 309 6 227 4187
48 3 2237 12 9 215 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0]
4、构建网络
本次任务本质就是文本的二分类问题,在此样本中,输入数据包含一个单词索引的数组。要预测的标签为 0 或 1。
# 输入形状是用于电影评论的词汇数目(88584 词)
vocab_size = 88584
model = keras.Sequential()
model.add(keras.layers.Embedding(vocab_size, 16))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
#打印模型
model.summary()
打印结果:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, None, 16) 160000
global_average_pooling1d (G (None, 16) 0
lobalAveragePooling1D)
dense (Dense) (None, 16) 272
dense_1 (Dense) (None, 1) 17
=================================================================
Total params: 160,289
Trainable params: 160,289
Non-trainable params: 0
- 第一层是
嵌入
层(Keras.layers.Embedding),该层采用整数编码的词汇表,并查找每个词索引的嵌入向量(embedding vector)。这些向量是通过模型训练学习到的。向量向输出数组增加了一个维度。得到的维度为:(batch, sequence, embedding)。
- 第二层是
keras.layers.GlobalAveragePooling1D
将通过对序列维度求平均值来为每个样本返回一个定长输出向量。keras.layers.GlobalAveragePooling1D
用于对时序数据进行全局平均池化。它是一个一维的池化层,可以将输入张量中的所有特征值相加并除以特征值的数量,从而得到一个二维的输出张量。这允许模型以尽可能最简单的方式处理变长输入。 - 第三层是全连接层(keras.layers.Dense)。该定长输出向量通过一个有 16 个隐层单元的全连接层传输,激活函数使用了relu。
- 第四层全连接层keras.layers.Dense与单个输出结点密集连接。使用
Sigmoid
激活函数,其函数值为介于 0 与 1 之间的浮点数,表示概率或置信度。