我觉得把课本上的案例先自己抄一遍,然后将书看一遍。最后再写一篇博客记录自己所学过程的感悟。虽然与课本有很多相似之处。但自己写一遍感悟会更深

电影评论分类(二分类问题)

本节使用的是IMDB数据集,使用Jupyter作为编译器。这是我刚开始使用Jupyter,不得不说它的自动补全真的不咋地(以前一直用pyCharm)但是看在能够分块运行代码的份上,忍了。用pyCharm敲代码确实很爽,但是调试不好调试(可能我没怎么用心学),而且如果你完全不懂代码含义的话,就算你运行成功也不知道其中的含义,代码有点白敲的感觉,如果中途出现错误,有的时候很不好找。但是Jupyter就好一点,你可以使用多个cell,建议如果不打印一些东西,cell还是少一点,不然联想功能特别弱,敲代码特别难受。

1. 加载IMDB数据集

仅保留前10000个最常出现的单词,低频单词被舍弃

from keras.datasets importimdb

(train_data, train_labels), (test_data, test_labels)= imdb.load_data(num_words=10000)

train_data[0]

train_labels[0]

max([max(sequence) for sequence in train_data])

下面这段代码:将某条评论迅速解码为英文单词

word_index =imdb.get_word_index()

reverse_word_index= dict([(value, key) for (key, value) inword_index.items()])

decoded_review= ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[0]])

2. 将整数序列编码为二进制矩阵

# 对列表进行one-hot编码,将其转换为0和1组成的向量

def vectorize_sequences(sequences, dimension=10000):

# 创建一个形状为(len(sequences), dimension)的零矩阵

# 序列[3, 5]将会被转换成10000维向量,只有索引3和5的元素为1,其余为0

results = np.zeros((len(sequences), dimension))

# 将results[i]指定索引设为1

for i, sequence in enumerate(sequences):

results[i, sequence] = 1

return results

# 将训练数据向量化

x_train = vectorize_sequences(train_data)

# 将测试数据向量化

x_test = vectorize_sequences(test_data)

x_train[0]

标签向量化

y_train = np.asarray(train_labels).astype('float32')

y_test= np.asarray(test_labels).astype('float32')

3. 模型定义

from keras importmodelsfrom keras importlayers

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

4. 编译模型

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

5. 配置优化器

from keras importoptimizers

model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

6. 使用自定义的损失和指标

from keras importlossesfrom keras importmetrics

model.compile(optimizer=optimizers.RMSprop(lr=0.001), loss=losses.binary_crossentropy, metrics=[metrics.binary_crossentropy])

7. 留出验证集

x_val = x_train[:10000]

partial_x_train= x_train[10000:]

y_val= y_train[:10000]

partial_y_train= y_train[10000:]

8. 训练模型

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

history_dict=history.history

history_dict.keys()

9. 绘制训练损失和验证损失

importmatplotlib.pyplot as plt

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

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

损失降得太狠了,训练的损失和精度不太重要,反应训练集的训练程度。重点是验证精度

10. 绘制训练精度和验证精度

plt.clf() #清除图像

acc = history_dict['acc']

val_acc= history_dict['val_acc']

plt.plot(epochs, acc,'bo', label='Training acc')

plt.plot(epochs, val_acc,'b', label='Validation acc')

plt.title('Training and validation accuracy')

plt.xlabel('Epochs')

plt.ylabel('Accuracy')

plt.legend()

plt.show()

可以看到验证的精度并不高,只有86%左右。而训练的精度达到几乎100%,两者精度相差太大,出现了过拟合。为了防止过拟合,可以在3轮之后停止训练。还有很多方法降低过拟合。我们一般看验证精度曲线就是找最高点对应的轮次,然后从头开始训练一个新的模型

11. 从头开始训练一个模型

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.28940243008613586, 0.88488]

得到了88%的精度,还有待优化的空间

12. 使用训练好的模型在新数据上生成预测结果

model.predict(x_test)

array([[0.20151292],

[0.9997969 ],

[0.9158534 ],

...,

[0.1382984 ],

[0.0817486 ],

[0.69964325]], dtype=float32)

可见。网络对某些样本的结果是非常确信(大于等于0.99),但对其他结果却不怎么确信

13. 总结

1. 加载数据集->对数据集进行预处理->模型定义->编译模型->配置优化器->使用自定义的损失和指标->留出验证集->训练模型->绘制图像

2. 对于二分类问题,网络的最后一层应该是只有一个单元并使用sigmoid激活Dense层,网络输出应该是0~1范围内的标量,表示概率值

3. 对于二分类问题的sigmoid标量输出,应该使用binary_crossentropy(二元交叉熵)损失函数。

python 二分类的实例_Python深度学习案例1--电影评论分类(二分类问题)相关推荐

  1. python读取文件数据恢复软件_python深度学习pdf恢复

    3步快速找回,让数据恢复变得简单 版权所有 1990-2020 B计划信息技术有限公司 python深度学习pdf python深度学习pdf Windows 10,Windows 7,Windows ...

  2. python如何实现找图_Python深度学习,手把手教你实现「以图搜图」

    随着深度学习的崛起,极大的推动了图像领域的发展,在提取特征这方面而言,神经网络目前有着不可替代的优势.之前文章中我们也介绍了图像检索往往是基于图像的特征比较,看特征匹配的程度有多少,从而检索出相似度高 ...

  3. python能做机器人吗_python深度学习 人工智能是做机器人吗?

    我们经常听到"Python"与"人工智能"这两个词, 也很容易混淆这两个词, 那么Python和人工智能到底什么关系呢? Python人工智能工程师待遇怎么样? ...

  4. python时间序列分析航空旅人_Python深度学习教程:LSTM时间序列预测小练习—国航乘客数量预测...

    Python深度学习教程:LSTM时间序列预测小练习-国航乘客数量预测 参考数据: 数据一共两列,左边是日期,右边是乘客数量 对数据做可视化:import math import numpy as n ...

  5. 深度学习应用13电影评论情感分析

    文章目录 1IMDB数据集的获取与处理 1.1下载数据集 1.2IMDB数据文件读取 1.3数据处理 1.4构建模型 1.5训练模型 1.6可视化 1.7评估准确率 1.8执行预测 具体代码见gith ...

  6. 深度学习实战案例:电影评论二分类

    第一个深度学习实战案例:电影评论分类 公众号:机器学习杂货店 作者:Peter 编辑:Peter 大家好,我是Peter~ 这里是机器学习杂货店 Machine Learning Grocery~ 本 ...

  7. 猿创征文丨深度学习基于双向LSTM模型完成文本分类任务

    大家好,我是猿童学,本期猿创征文的第三期,也是最后一期,给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含 ...

  8. 深度学习基于双向 LSTM 模型完成文本分类任务

    大家好,本期给大家带来神经网络中的循环神经网络案例,基于双向LSTM模型完成文本分类任务,数据集来自kaggle,对电影评论进行文本分类. 电影评论可以蕴含丰富的情感:比如喜欢.讨厌.等等.情感分析( ...

  9. 【深度学习】Keras实现回归和二分类问题讲解

    [深度学习]Keras实现回归和二分类问题讲解 文章目录 [深度学习]Keras实现回归和二分类问题讲解 1 回归问题1.1 波士顿房价预测数据集1.2 构建基准模型1.3 数据预处理1.4 超参数 ...

  10. 基于python语言,使用爬虫和深度学习来预测双色球(二、模型训练与测试)

    在上一篇博文中(基于python语言,使用爬虫和深度学习来预测双色球(一.数据的准备)),我们完成了数据的准备,通过爬虫的方式将2003年至今的每一期的中奖数据保存到了txt文件中,那么我们现在就开始 ...

最新文章

  1. Windows系统安装zabbix-agent客户端
  2. IntelliJ IDEA使用(一):创建maven web项目
  3. 使用.Net Core实现的一个图形验证码
  4. java中匿名数组_Swagger UI:数组中的多个匿名对象
  5. LeetCode——350. 两个数组的交集 II
  6. oracle字段公式怎么执行,Oracle 在存储过程或函数中执行字符串sql PDF 下载
  7. NeHe OpenGL第十九课:粒子系统
  8. java为什么密码比字符串更喜欢char []?
  9. 使用annotation配置hibernate(1)
  10. FL Studio20.8中文版界面下载更新内容介绍
  11. 移动端开发项目的一些躺坑笔记
  12. android 获取默认字体,Android中的默认字体系列是什么?
  13. 【贝尔链创始人Vincent: 区块链不仅是技术革命 更是认知革命】
  14. 在电脑上怎么压缩ppt文件?
  15. JavaScript之深浅拷贝
  16. 微信公众号盈利模式_微信公众号的盈利方式有哪些?
  17. 请将插入点移动到word域以外-NoteExpress
  18. The following packages have unmet dependencies问题
  19. 鸿蒙系统推广时间,鸿蒙系统将全面推广,目标覆盖3亿台设备,第三方IoT可达1亿台...
  20. 《StereoDRNet: Dilated Residual StereoNet》

热门文章

  1. xcode 调试提示
  2. 基本入门的C/C++算法总结
  3. oxygen版本eclipse使用Junit和spring静态工厂实例化bean的例子,出现java.lang.IllegalArgumentException异常。
  4. 类的加载过程详解之过程四:类的Using使用
  5. jsp三大指令(总结)
  6. Ant十五大最佳实践
  7. django实现目录上传(最简单的方法)
  8. H3C交换机做DHCP
  9. cookie和session机制之间的区别与联系
  10. 03_后台管理页面商品列表查询