编写imdb评价判断神经网络
首先,导入数据
from keras.datasets import imdb
(x_train,y_train),(x_test,y_test) = imdb.load_data(num_words=10000)
num_words=10000 表示:选取评论中前10 000个常用的单词,所以单词索引都不会超过10 000。
现在,让我们查看下数据的大小:
print(x_train.shape,y_train.shape)
print(x_test.shape,y_test.shape)
输出:
(25000,) (25000,)
(25000,) (25000,)
可知训练集和测试集都有25000条评论
查看其中的一条评论:
print(x_train[0])
输出的是一个列表,列表里是一长串的1~10000的数字。
可知,每条评论都是一个列表,评论里的单词全都转化为对应 单词的编码 保存。
再查看下标签:
print(y_train[0])
输出:1
train_labels 和 test_labels 都是 0 和 1 组成的列表,其中
0代表负面(negative),1 代表正面(positive)。
我们编写的网络的目的是 输出判断评论是正面还是负面的--------故,需要构建二分类模型。
理清思路后,开始构建模型。
from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(64,activation='relu',input_shape=(10000,)))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(1,activation='sigmoid'))
由于我们的输出是一个0~1的数据,即为判断正,负面评论的概率,故输出层的激活函数为sigmoid。
输出层经过sigmoid输出后,得到一个大小为0~1数值,即判断正负面评论的概率。
接着定义学习模式:
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['acc']
)
optimizer(优化器):选择rmsprop
loss(损失函数):二元交叉熵,binary_cross_entropy是二分类的交叉熵,实际是多分类softmax_cross_entropy的一种特殊情况
metrics(评价标准):准确度,分类问题的评价标准一般都为准确度。
接着,我们要处理输入数据:
由于输出为 1 个0~1的数,标签为0或1,表达形式一致,则不需要变换表达形式,只需变换格式。
y_train = np.asarray(y_train).astype('float32')
y_test = np.asarray(y_test).astype('float32')
模型无法通过 列表 学习,所以单个传入的数据(input_shape)需要由1个列表改为1个大小为10000的向量,
原数据中的 数字 对应 向量 索引处的 1,其余为0。
现在,我们需要编写一个方法将其转化:
def vectorize_sequences(sequences,dimension=10000):
results = np.zeros((len(sequences),dimension))
for i, sequences in enumerate(sequences):
results[i,sequences] = 1
return results
x_train = vectorize_sequences(x_train)
x_test = vectorize_sequences(x_test)
这样,每条评论的大小都为 1 个大小为 10 000 的向量。评论逐条累积,最终输出的是一个(25 000,10 000)的numpy数组。
接着,开始训练模型:
model.fit(x_train,y_train,epochs=5,batch_size=512)
训练5轮,每次训练传入512个数据(512,10000)
训练好后,用测试组评估模型:
results = model.evaluate(x_test,y_test) #[0.3537677825450897, 0.8465]
print(results)
准确度有达到0.8465。
注意,在训练模型时,可能会有Memor Error,需要自行调整训练集的大小,以及batch_size。