IMDB电影评论 情感分析实例(二)
二、准备数据
对数据有了一定的了解之后,接下来我们将对输入神经网络的数据进行处理。
我们不能将整数序列直接输入神经网络,需要先将列表转换为张量。转换方式有以下两种:
1、one-hot编码
假如我们仅保留训练数据的前5000个最常见出现的单词,低频单词将被舍弃。这样得到的向量数据不会太大,便于处理。
这样序列[5,9]将会被转换成为5000维向量,只有索引5,9位置的元素是1,其余都是0。
但该方法效率较低,会极大地占用内存。我们重点介绍第二中方法。
2、词嵌入(Word Embeddings)
词嵌入来源于Beggio的论文,是一种将词向量化的概念,原理是:单词在高维空间中被编码为实值向量,其中词语之间的
相似性意味着向量空间中的接近度,离散词被映射到连续数的向量。
Keras 通过嵌入层(Embedding)将单词的正整数表示转换为词嵌入,嵌入层需要制定词汇大小预期的最大数量,以及输出的每个
词向量的维度。
这里我们同样只保留前5000个最常用的单词,因此词向量的大小为5000,选择使用32维向量来表示每个单词
,构建嵌入层输出。同时,将影评的长度限制在500个单词以内。实现如下:
top_words = 5000
max_words = 500
out_dimension = 32
# 限定数据集的长度
x_train = sequence.pad_sequences(x_train, maxlen=max_words)
x_validation = sequence.pad_sequences(x_validation, maxlen=max_words)
model = Sequential()
# 构建嵌入层
model.add(Embedding(top_words, out_dimension, input_length=max_words))
三、构建网络
到这里,数据准备好了,下面我们开始构建卷积神经网络
我们在词嵌入层之后,增加一层以为卷积层和池化层,完整代码如下:
from keras.datasets import imdb
import numpy as np
from keras.preprocessing import sequence
from keras.layers.embeddings import Embedding
from keras.layers.convolutional import Conv1D, MaxPooling1D
from keras.layers import Dense, Flatten,Dropout
from keras.models import Sequential
seed = 7
top_words = 5000
max_words = 500
out_dimension = 32
batch_size = 512
epochs = 10
def create_model():
model = Sequential()
# 构建嵌入层
model.add(Embedding(top_words, out_dimension, input_length=max_words))
# 1维度卷积层
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
return model
if __name__ == '__main__':
np.random.seed(seed=seed)
# 导入数据
(x_train, y_train), (x_validation, y_validation) = imdb.load_data(num_words=top_words)
# 限定数据集的长度
x_train = sequence.pad_sequences(x_train, maxlen=max_words)
x_validation = sequence.pad_sequences(x_validation, maxlen=max_words)
# 生成模型
model = create_model()
history=model.fit(x_train, y_train, validation_data=(x_validation, y_validation),
batch_size=batch_size, epochs=epochs, verbose=2)
四、画图分析
我们来看一下在训练集和验证集上的accurcy和loss
import matplotlib.pyplot as plt
history_dict = history.history
history_dict.keys()
epochs1 = range(1, len(acc) + 1)
# "bo" is for "blue dot"
plt.plot(epochs1, loss, 'bo', label='Training loss') # bo表示蓝色圆点
# b is for "solid blue line"
plt.plot(epochs1, val_loss, 'b', label='Validation loss') # b表示蓝色实线
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
plt.clf() # clear figure
acc_values = history_dict['acc']
val_acc_values = history_dict['val_acc']
plt.plot(epochs1, acc, 'bo', label='Training acc')
plt.plot(epochs1, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
可以注意到,训练损失随着周期数的增加而降低,训练准确率随着周期数的增加而提高。在使用梯度下降法优化模型时,这属于正常现象 - 该方法应在每次迭代时尽可能降低目标值。
验证损失和准确率的变化情况并非如此,似乎出现了过拟合现象,模型在训练数据上的表现要优于在从未见过的数据上的表现。
- 点赞
- 收藏
- 关注作者
评论(0)