文章目录
1.数据集及问题简介
IMDB 数据集,它包含来自互联网电影数据库(IMDB)的50000 条严重两极分化的评论。数据集被分为用于训练的25000 条评论与用于测试的25000 条评论,训练集和测试集都包含50% 的正面评论和50% 的负面评论。
与MNIST 数据集一样,IMDB 数据集也内置于Keras 库。它已经过预处理:评论(单词序列
)已经被转换为整数序列
,其中每个整数代表字典中的某个单词。
我们需要学习根据电影评论的文字内容
将其划分为正面或负面
。
2.加载数据集并探索数据
(1)加载数据
仅保留训练数据中前 10000 个最常出现的单词,低频单词将被舍弃(评论数量没有变,只是每条评论的单词减少了)。
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)
(2)查看数据大小及格式
>>> train_data[0]
[1, 14, 22, 16, ... 178, 32]
>>> train_labels[0]
1
>>> max([max(sequence) for sequence in train_data])
9999
train_data 和test_data 这两个变量都是评论组成的列表,每条评论又是单词索引组成的列表(表示一系列单词)。train_labels 和test_labels 都是0 和1 组成的列表,其中0代表负面(negative),1 代表正面(positive)。由于限定为前10 000 个最常见的单词,单词索引都不会超过10 000。
(3)把索引转为单词
word_index = imdb.get_word_index()
reverse_word_index = dict(
[(value, key) for (key, value) in word_index.items()])
decoded_review = ' '.join(
[reverse_word_index.get(i - 3, '?') for i in train_data[0]])
0、1、2是为“padding”(填充)、“start of sequence”(序列开始)、“unknown”(未知词)分别保留的索引。
3.准备输入的数据
我们需要将列表转换为张量。转换方法有以下两种。
- 填充列表,使其具有相同的长度,再将列表转换成形状为 (samples, word_indices)的整数张量,然后网络第一层使用能处理这种整数张量的层(即Embedding 层)。
- 对列表进行 one-hot 编码,将其转换为 0 和 1 组成的向量。举个例子,序列[3, 5]将会被转换为10 000 维向量,只有索引为3 和5 的元素是1,其余元素都是0。然后网络第一层可以用Dense 层,它能够处理浮点数向量数据。
下面我们采用后一种方法将数据向量化。
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
# Create an all-zero matrix of shape (len(sequences), dimension)
results = np.zeros((len(sequences), dimension))#10000 x 10000
for i, sequence in enumerate(sequences):
results[i, sequence] = 1. # set specific indices of results[i] to 1s
return results
# Our vectorized training data
x_train = vectorize_sequences(train_data)
# Our vectorized test data
x_test = vectorize_