IMDB数据集下载速度慢,可以在我的[repo库](> IMDB数据集下载速度慢,可以在我的repo库中找到下载,下载后放到/.keras/datasets/目录下,即可正常运行。)中找到下载,下载后**放到/.keras/datasets/目录下**,即可正常运行。
电影评论分类:二分类
二分类可能是机器学习最常解决的问题。我们将基于评论的内容将电影评论分类:正类和负类。
IMDB数据集
IMDB数据集有5万条来自网络电影数据库的评论;其中2万5千条用来训练,2万5千条用来测试,每个部分正负评论各占50%.
划分训练集、测试集的必要性:不能在相同的数据集上对机器学习模型进行测试。因为在训练集上模型表现好并不意味着泛化能力好(在没有见过的数据上仍然表现良好),而我们关心的是模型的泛化能力.
和MNIST数据集类似,IMDB数据集也集成在Keras中,同时经过了预处理:电影评论转换成了一系列数字,每个数字代表字典中的一个单词。
加载数据集
from keras.datasets import imdb
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words=10000)
num_words=10000意味着只保留训练集中最常出现的前10000个词,不经常出现的单词被抛弃—最终所有评论的维度保持相同。
变量train_data,test_data是电影评论的列表,每条评论由数字(对应单词在词典中出现的位置下标)列表组成。train_labels,test_labels是0,1列表,0负面评论,1表示正面评论。
>>> train_data[0]
[1, 14, 22, 16, ... 178, 32]
>>> train_labels[0]
1
预处理数据
不能直接将list类型的数据送到神经网络中训练,必须将list类型转换为tensor张量类型。有两种转换方式:
- 填充列表使每个列表长度都相同,然后转换为整数类型的张量,形状为(samples, word_indices),使用张量作为神经网络的第一层(Embedding层,能处理这样的整数类型张量);
- 将列表进行one-hot编码,转换成0、 1向量。然后用Dense网络层作为神经网络的第一层,处理浮点类型向量数据。
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension)) #数据集长度,每个评论维度10000
for i, sequence in enumerate(sequences):
results[i, sequence] = 1 # one-hot
return results
x_train = vectorize_sequences(