深度学习之电影二分类的情感问题

? this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert ? is an amazing actor and now the same being director ?
二、格式化输入数据
由于我们无法直接将整数序列输入神经网络,所以需要将其转换为张量 。可以通过以下两种方式进行转化
这里我们采用one-hot进行编码处理
def vectorize_sequences(sequences, diamension = 10000):results = np.zeros((len(sequences), diamension))for i, sequence in enumerate(sequences):results[i, sequence] = 1return resultsx_train = vectorize_sequences(train_data)print(x_train[0])print(len(x_train[0]))x_test = vectorize_sequences(test_data)print(x_test[0])print(len(x_test[0]))
转化完成的输入结果
[0. 1. 1. ... 0. 0. 0.]10000[0. 1. 1. ... 0. 0. 0.]10000
将标签进行向量化处理
y_train = np.asarray(train_labels).astype('float32')y_test = np.asarray(test_labels).astype('float32')
三、构建神经网络
针对这里二分类单标签,我们可以直接使用带有relu激活函数的全连接层的简单堆叠 。
我们使用了两个具有16个隐藏单元的中间层和具有一个隐藏单元的层 。中间层使用的relu激活函数负责将所有的负值归零,最后一层使用函数将任意值压缩到[0,1]之间并作为预测结果的概率 。
model = models.Sequential()model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))model.add(layers.Dense(16, activation='relu'))model.add(layers.Dense(1, activation='sigmoid'))
这里的Dense层实现了如下的张量计算,传入Dense层的参数16表示隐藏单元的个数,同时也表示这个层输出的数据的维度数量 。隐藏单元越多,网络越能够学习到更加复杂的表示,但是网络计算的代价就越高 。

深度学习之电影二分类的情感问题

文章插图
output = relu(dot(W, input) + b)
我们使用优化器和损失函数来配置模型 。
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
四、训练模型
将训练数据分出一小部分作为校验数据,同时将512个样本作为一批量处理,并进行20轮的训练,同时出入来监控校验样本上的损失和计算精度 。
x_val = x_train[:10000]partial_x_train = x_train[10000:]y_val = y_train[:10000]partial_y_train = y_train[10000:]history = model.fit(partial_x_train, partial_y_train, epochs= 20, batch_size=512, validation_data=http://www.kingceram.com/post/(x_val, y_val))
调用fit()返回的对象包含训练过程的所有数据
history_dict = history.historyprint(history_dict.keys())
字典中包含4个条目,对应训练过程和校验过程的指标,其中loss是训练过程中损失指标,是训练过程的准确性指标,而是校验过程的损失指标,是校验过程的准确性指标 。
dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
我们使用画出训练损失和校验损失的情况
loss_values = history_dict['loss']val_loss_values = history_dict['val_loss']epochs = range(1, len(loss_values) + 1)plt.plot(epochs, loss_values, 'bo', label='Training loss')plt.plot(epochs, val_loss_values, 'b', label='Validation loss')plt.title('Training and validation loss')plt.xlabel('Epochs')plt.ylabel('Loss')plt.legend()plt.show()
从图中可以看到整个训练过程,损失函数值一直在不断的变小,但是校验过程的损失函数值却先变小后变大,在2.5-5之间的某个点达到最小值 。