记:二分类问题应该是应用最广泛的机器学习问题,电影评论分类是指根据电影评论的文字内容,将其划分为正面评论或者是负面评论,是一个二分类问题,我从头到尾学习了代码,并且进行了整理,有的内容是个人理解,如有错误还请指正。(本代码实在jupyter notebook上完成的)

1、典型的keras工作流程

(1)定义训练数据:输入张量和目标张量

(2)定义层组成的网络(模型),将输入映射到目标

(3)配置学习过程:选择合适的损失函数,优化器和需要监控的指标

(4)调用模型的fit方法在训练数据上进行迭代

2、IMDB数据集:包含来自互联网电影数据库的50000条严重两极分化的评论,数据集被分成两部分,分别是训练集25000条,测试集25000条。在实验的时候需要将每一条评论里的单词转化为对应的整数索引,再将正序序列转换为张量才能输入到神经网络中,转换成张量时一般会把列表进行one-hot编码,将其转换成0和1组成的向量。

3、常见问题损失函数的选择:

对于二分类问题,可以选择二元交叉熵(binary crossentropy)损失函数;对于多分类问题,可以选择分类交叉熵(categorical crossentropy)损失函数;对于回归问题,可以选择均方误差(mean-squared error)损失函数;对于序列学习问题,可以用联结主义时序分类(CTC,connectionist temporal classification)损失函数。

4、完整代码以及代码部分注释如下:

#引入所需要的包
from keras.datasets import imdb
import numpy as np
from keras import models
from keras import layers
from keras import optimizers
from keras import losses
from keras import metrics
import matplotlib.pyplot as plt#加载IMDB数据集
#train_data,test_data都是由评论组成的列表,每条评论又是单词索引组成的列表
#train_labels,test_labels都是0和1组成的列表,0代表负面,1代表正面(train_data,train_labels),(test_data,test_labels)=imdb.load_data(num_words=10000)
#num_words=10000意思时只保留训练数据中前10000个最常出现的单词,低频单词将被舍弃#数据集的一些信息,train_data.shape为(25000,)
print(train_data.shape)
print(train_labels[0])word_index=imdb.get_word_index()#将单词映射为整数索引的字典
reverse_word_index=dict([(value,key) for (key,value) in word_index.items()])#键值颠倒
decoded_review=' '.join([reverse_word_index.get(i-3,'?') for i in train_data[0]])#解码,i-3是因为0,1,2是“填充”,“序列开始”,“未知词”#查看解码后的数据
print(decoded_review)
#将整数序列编码为二进制矩阵,之后才能够将数据输入到神经网络中
def vectorize_sequences(sequences,dimension=10000):results=np.zeros((len(sequences),dimension))#创建一个该形状的零矩阵for i,sequence in enumerate(sequences):results[i,sequence]=1.return results
x_train=vectorize_sequences(train_data)#进行向量化
x_test=vectorize_sequences(test_data)#将标签向量化
y_train=np.asarray(train_labels).astype('float32')
y_test=np.asarray(test_labels).astype('float32')print(x_train.shape)
print(x_test.shape)
print(y_train.shape)

解码后的数据如下:

向量化之后的数据形状如下:

#模型定义
#个人理解,哪个compile写在最后的话,最后history返回的字典中就与哪个compile相关,下面
#的训练模型之前又写了个#model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
#在画图的时候就要注意字典中的关键字keymodel=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'))#编译模型
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])#配置自定义优化器的参数
model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss='binary_crossentropy',metrics=['accuracy'])#使用自定义的损失和指标
model.compile(optimizer=optimizers.RMSprop(lr=0.001),loss=losses.binary_crossentropy,metrics=[metrics.binary_accuracy])
#留出验证集10000个样本,x_val,y_val对应于验证集
#partial_x_train,partial_y_train对应与训练集x_val=x_train[:10000]
partial_x_train=x_train[10000:]y_val=y_train[:10000]
partial_y_train=y_train[10000:]#训练模型,
model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
history=model.fit(partial_x_train,partial_y_train,epochs=20,batch_size=512,validation_data=(x_val,y_val))

执行fit函数之后的结果如下:(一共迭代20次,图没有截完整,后面会作图显示出来)

#字典中返回4个指标,分别是:验证集损失函数值,验证集精度,训练集损失函数值,训练集精度
history_dict=history.history
print(history_dict.keys())#输出结果为:dict_keys(['val_loss', 'val_acc', 'loss', 'acc'])#如果去掉最后一个compile,则输出结果为:dict_keys(['val_acc', 'acc', 'val_loss', 'loss'])
#绘制字典中的训练和验证损失值图像history_dict=history.history
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')#bo表示蓝色原点
plt.plot(epochs,val_loss_values,'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(epochs, acc_values, 'bo', label='Training acc')
plt.plot(epochs, val_acc_values, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()plt.show()

结论:训练损失每轮都在降低,训练精度每轮都在提升,这也符合我们想要的结果;但是验证损失和验证精度确非如此,他们在一定次数的迭代之后结果开始慢慢变差。即模型在训练集上的表现越来越好,但在没有训练过的数据上不一定会越来越好,也就是“过拟合”的情况,所以为了防止过拟合我们可以在第三轮左右就停止训练,通常情况下需要用很多方法来降低过拟合。

#鉴于上面验证数据的表现,下面我们重新训练一个模型,指迭代4次,然后在测试集上评估该模型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'))model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])
model.fit(x_train,y_train,epochs=4,batch_size=512)
results=model.evaluate(x_test,y_test)#results的结果为:[0.29865485565185546, 0.88252]
#使用训练好的网络在测试集上生成预测结果predict_result=model.predict(x_test)print(predict_result)
print(predict_result.shape)

输出结果如下:

对于某些样本来说该网络非常确认,达到了99%的精度,而对某些样本并不确认,只有10%的精度

电影评论分类(python深度学习——二分类问题)相关推荐

  1. 机器学习之深度学习 二分类、多分类、多标签分类、多任务分类

    多任务学习可以运用到许多的场景. 首先,多任务学习可以学到多个任务的共享表示,这个共享表示具有较强的抽象能力,能够适应多个不同但相关的目标,通常可以使主任务获取更好的泛化能力. 此外,由于使用了共享表 ...

  2. 新闻分类(python深度学习——多分类问题)

    记:新闻分类问题时多分类问题,与电影评论分类很类似又有一些差别,电影评论只有两个分类,而新闻分类有46个分类,所以在空间维度上有所增加,多分类问题的损失函数与二分类问题选择不同,最后一层使用的激活函数 ...

  3. Python深度学习之分类模型示例,MNIST数据集手写数字识别

    MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度手写数字图片. 我们把60000个训练样本分成两部分,前 ...

  4. 毕设 GRU的 电影评论情感分析 - python 深度学习 情感分类

    文章目录 1 前言 项目介绍 2 情感分类介绍 3 数据集 4 实现 4.1 数据预处理 4.2 构建网络 4.3 训练模型 4.4 模型评估 4.5 模型预测 5 最后 1 前言

  5. 最简单深度学习Python实现(二分类问题)

    二分类问题指的是所有数据的标签就只有两种,正面或者负面. 一,准备数据 我们使用的数据是内置于Keras的IMDB数据集.它包含50000条两极分化的电影评论,正面评论和负面评论各占一半.其中2500 ...

  6. Python深度学习(4):猫狗分类

    这个项目使用卷积神经网络,<Python深度学习>中使用了两个方法实现.一个是自己搭建卷积网络,另一个是直接使用VGG16.其中直接使用VGG16又可以分为抽取特征和微调模型两种方法. 1 ...

  7. Python深度学习实战:声呐返回值分类

    Python深度学习实战:声呐返回值分类 声呐物体分类数据 简单的神经网络 预处理数据以增加性能 调整模型的拓扑和神经元 缩小网络 扩大网络 总结 本章我们使用Keras开发一个二分类网络.本章包括: ...

  8. 《Python 深度学习》刷书笔记 Chapter 4 关于电影评论模型的进一步探讨

    文章目录 电影评论模型的进一步改进 4-3 原始模型 4-4 容量更小的模型 4-5 容量更大的模型 4-6 向模型中添加L2权重正则化 写在最后 电影评论模型的进一步改进 我们将在这一节使用实验的方 ...

  9. python 动物分类_《python深度学习》笔记---5.3-1、猫狗分类(使用预训练网络)

    <python深度学习>笔记---5.3-1.猫狗分类(使用预训练网络) 一.总结 一句话总结: [小型图像数据集]:想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训 ...

最新文章

  1. [模板][持续更新]欧拉回路与欧拉路径浅析
  2. Xilinx FPGA开发工具总结
  3. Java File类基本操作
  4. getmenuiteminfo无法读取内存_笔记本内存加装教程,看完包会!为了这篇文章,我把电脑都拆了!...
  5. switch 根据键盘录入成绩 显示分数及判断等级(第一次)
  6. js,jq.事件代理(事件委托)复习。
  7. Do not use built-in or reserved HTML elements as component id等等vue warn问题
  8. 问题十六:使用初始化列表的构造函数和使用函数体的构造函数有什么区别?
  9. 【高德LBS开源组件大赛】iOS版地图选中Overlay功能组件
  10. web中缓存的几种方式
  11. html 5拜年贺卡,HTML5+CSS3实现春节贺卡
  12. 小米5SPLUS Android9.0,小米5S Plus线刷MIUI9的教程_小米5SPlus MIUI9系统刷机包
  13. Ubuntu 实现shell文件的开机运行(从原理到实现)
  14. windows环境命令行创建虚拟环境
  15. 基于NodeJS实现企业微信机器人推送
  16. 爬虫练习网站 -http://quotes.toscrape.com的爬虫练习
  17. 西工大计算机学院优秀毕业生,计算机学院优秀博士毕业生陈穆林:不负时光 不负自己 奋斗的时光是一抹永不褪色记忆...
  18. ↖杨过↖ ↗小龙女↗
  19. 送书活动还有最后一本书,怎么办呢?
  20. 关于数据结构中的叶节点和二度节点的关系(通俗的理解)。

热门文章

  1. 面板数据分析及stata应用笔记
  2. daytime协议的服务器和客户端程序,用Socket套接字实现DAYTIME协议的服务器和客户端程序-20210726002244.doc-原创力文档...
  3. 判断全角与半角及两者之间的转换
  4. quick-cocos2d-x 绑定C++自定义类
  5. 爬虫ip代理对高匿代理ip的重要性
  6. 微服务实施笔记(四)——部署服务发现
  7. 微信小程序开发页面无法显示,未注册报错
  8. 免费开发工具与IAR工具的比较
  9. epiphone真伪
  10. Linux学习(CentOS-7)---Linux开机流程