IMDB电影评论 情感分析实例(二)

举报
tengyun 发表于 2019/10/28 23:36:28 2019/10/28
【摘要】 对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)

1.png

2.png

四、画图分析

我们来看一下在训练集和验证集上的accurcy和loss

import matplotlib.pyplot as plt

history_dict = history.history

history_dict.keys()

3.png

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()

4.png

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()

5.png

可以注意到,训练损失随着周期数的增加而降低,训练准确率随着周期数的增加而提高。在使用梯度下降法优化模型时,这属于正常现象 - 该方法应在每次迭代时尽可能降低目标值。

验证损失和准确率的变化情况并非如此,似乎出现了过拟合现象,模型在训练数据上的表现要优于在从未见过的数据上的表现。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。