Tensorflow2.1实现文本中情感分类实现解析

目录
  • 前言
  • 实现过程和思路解析
    • 下载影评数据并进行 padding 处理
    • 创建验证集数据
    • 搭建简单的深度学习模型
    • 配置并编译模型
    • 训练模型
    • 评估模型

前言

本文主要是用 cpu 版本的 tensorflow 2.1 搭建深度学习模型,完成对电影评论的情感分类任务。 本次实践的数据来源于IMDB 数据集,里面的包含的是电影的影评,每条影评评论文本分为积极类型或消极类型。数据集总共包含 50000 条影评文本,取该数据集的 25000 条影评数据作为训练集,另外 25000 条作为测试集,训练集与测试集中包含相等数量的积极和消极影评,保证数据质量的平衡。

实现过程和思路解析

下载影评数据并进行 padding 处理

(1)这里主要是通过 tf 内置的接口从网络上下载 imdb 数据,该数据是已经经过处理的,每一条评论中的每个单词都是用对应的整数表示的,所以每一条评论都是一个整数列表。而对应的每条影评的标签是一个 0 或 1 的整数, 0 代表的是消极评论,1 代表的是积极评论。

(2)这里的 num_words=6000 表示我们只需要保留了训练数据中出现频率最高的 6000 个常用单词,低频词会被全部弃用,因为一方面这些低频词可能是些符号或者停用词,对影评情感分类没有意义,另一方面如果低频词太多,需要构造的词典太过庞大,严重影响计算效率,且消耗大量内存。

import tensorflow as tf
from tensorflow import keras
imdb = keras.datasets.imdb
num_words = 6000
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=num_words)

(3)这里主要是建立整数与单词之间的映射关系,并建立了一个函数 decode_review 可以将影评数据从数字序列转换回单词序列。

word_index = imdb.get_word_index()
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2  # unknown
word_index["<UNUSED>"] = 3
index_word = dict([(value, key) for (key, value) in word_index.items()])
def decode_review(text):
    return ' '.join([index_word.get(i, '?') for i in text])

(4)这里主要是对影评数据进行填充,因为每条数据的长度(数字序列的长度)是不一致的,而要进行深度学习模型的输入必须要保证每条影评数据的长度相等,所以我们要进行填充操作,指定了最大的影评长度 maxlen 为 256 ,如果超过 256 则进行截断,如果不足 256 则用 0 (也就是<PAD>对应的整数)在末尾进行填充。这里的 maxlen 可以随意指定,但是其长度会影响模型的效果,需要在实践中不断调整折中。

train_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], padding='post', maxlen=256)
val_data = keras.preprocessing.sequence.pad_sequences(val_data, value=word_index["<PAD>"], padding='post', maxlen=256)
test_data = keras.preprocessing.sequence.pad_sequences(test_data, value=word_index["<PAD>"], padding='post', maxlen=256)

创建验证集数据

这里主要是创建验证集,那么有了训练集为什么要创建验证集呢?首先我们要知道训练集数据是用来开发和调整模型的,而检查模型的准确率指标只能是用未见过的数据进行评测,所以我们从原始的训练数据中抽取出 10000 个样本来创建验证集,此时训练样本只有 15000 个,我们结合使用训练集和验证集共同调整和开发模型,当模型定型之后,最后需要使用一次测试集评估模型的实际使用效果即可。

val_data = train_data[:10000]
val_labels = train_labels[:10000]
train_data = train_data[10000:]
train_labels = train_labels[10000:]

搭建简单的深度学习模型

(1)第一层是 Embedding 层,它将输入的每一个单词转换为一个 32 维的向量,所以每一个样本输入就从一维的 (sequence) 变成了二维的 (sequence, 32)

(2)第二层主要是使用了平均池化操作 GlobalAveragePooling1D , 此操作可以将每个样本的二维维度向量 (sequence, 32) 又压缩成一维向量 (32) ,上一步中的 32 维向量表示的是每个单词向量,但是这里的 32 维向量表示的是一个影评样本向量。

(3)第三层是一个通过 relu 激活函数将输入转换成输出为 16 维度向量的全连接层操作

(4)第四层是一个通过 sigmoid 激活函数将输入转换成输出为 1 维度向量的全连接层操作,也就是最后输出一个介于 0 与 1 之间的浮点数,它表示了概率,常规情况下如果概率大于等于 0.5 则说明该样本预测类别为 1 ,否则说明该样本预测类别为 0

model = keras.Sequential()
model.add(keras.layers.Embedding(num_words, 32))
model.add(keras.layers.GlobalAveragePooling1D())
model.add(keras.layers.Dense(16 , activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()

配置并编译模型

(1)我们选择了常用的 Adam 优化器,你也可以自行选择其他优化器。

(2)因为这是一个二分类问题且模型会输出一个概率值,我们选择了常见的 binary_crossentropy 损失函数。

(3)评估指标我们选择了最容易理解的准确率 accuracy 。

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

训练模型

这里主要是使用训练数据进行模型的训练,使用训练集反复进行 40 次模型训练,并且在训练过程中,使用验证集的 10000 个样本来评估模型上的损失值(loss)和准确率(accuracy)。

model.fit(train_data, train_labels, epochs=40, batch_size=512, validation_data=(val_data, val_labels), verbose=1)

输出如下所示:

Train on 15000 samples, validate on 10000 samples
Epoch 1/40
15000/15000 [==============================] - 3s 169us/sample - loss: 0.6913 - accuracy: 0.5465 - val_loss: 0.6881 - val_accuracy: 0.6872
Epoch 2/40
15000/15000 [==============================] - 1s 88us/sample - loss: 0.6815 - accuracy: 0.7043 - val_loss: 0.6732 - val_accuracy: 0.7427
Epoch 3/40
...
Epoch 38/40
15000/15000 [==============================] - 1s 79us/sample - loss: 0.1045 - accuracy: 0.9707 - val_loss: 0.3431 - val_accuracy: 0.8738
Epoch 39/40
15000/15000 [==============================] - 1s 76us/sample - loss: 0.1022 - accuracy: 0.9712 - val_loss: 0.3470 - val_accuracy: 0.8737
Epoch 40/40
15000/15000 [==============================] - 1s 77us/sample - loss: 0.0985 - accuracy: 0.9735 - val_loss: 0.3526 - val_accuracy: 0.8725

评估模型

这里主要是使用测试数据对模型进行评估,由于当前模型较为简单,如果使用复杂的模型和更好的训练方法,准确率应该能达到 98% 以上.

model.evaluate(test_data,  test_labels, verbose=2)

结果输出为,损失为 0.368 ,准确率为 0.86488 :

[0.368153291721344, 0.86488]

以上就是Tensorflow2.1实现文本中情感分类实现解析的详细内容,更多关于Tensorflow2.1文本情感分类的资料请关注我们其它相关文章!

(0)

相关推荐

  • Tensorflow深度学习使用CNN分类英文文本

    目录 前言 源码与数据 源码 数据 train.py 源码及分析 data_helpers.py 源码及分析 text_cnn.py 源码及分析 前言 Github源码地址 本文同时也是学习唐宇迪老师深度学习课程的一些理解与记录. 文中代码是实现在TensorFlow下使用卷积神经网络(CNN)做英文文本的分类任务(本次是垃圾邮件的二分类任务),当然垃圾邮件分类是一种应用环境,模型方法也可以推广到其它应用场景,如电商商品好评差评分类.正负面新闻等. 源码与数据 源码 - data_helpers

  • Tensorflow 2.1完成对MPG回归预测详解

    目录 前言 1. 获取 Auto MPG 数据并进行数据的归一化处理 2. 对数据进行处理 搭建深度学习模型 使用 EarlyStoping 完成模型训练 使用测试数据对模型进行评估 使用模型进行预测 展示没有进行归一化操作的训练过程 前言 本文的主要内容是使用 cpu 版本的 tensorflor-2.1 完成对 Auto MPG 数据集的回归预测任务. 本文大纲 获取 Auto MPG 数据 对数据进行处理 搭建深度学习模型.并完成模型的配置和编译 使用 EarlyStoping 完成模型训

  • tensorflow学习教程之文本分类详析

    前言 这几天caffe2发布了,支持移动端,我理解是类似单片机的物联网吧应该不是手机之类的,试想iphone7跑CNN,画面太美~ 作为一个刚入坑的,甚至还没入坑的人,咱们还是老实研究下tensorflow吧,虽然它没有caffe好上手.tensorflow的特点我就不介绍了: 基于Python,写的很快并且具有可读性. 支持CPU和GPU,在多GPU系统上的运行更为顺畅. 代码编译效率较高. 社区发展的非常迅速并且活跃. 能够生成显示网络拓扑结构和性能的可视化图. tensorflow(tf)

  • 使用tensorflow DataSet实现高效加载变长文本输入

    DataSet是tensorflow 1.3版本推出的一个high-level的api,在1.3版本还只是处于测试阶段,1.4版本已经正式推出. 在网上搜了一遍,发现关于使用DataSet加载文本的资料比较少,官方举的例子只是csv格式的,要求csv文件中所有样本必须具有相同的维度,也就是padding必须在写入csv文件之前做掉,这会增加文件的大小. 经过一番折腾试验,这里给出一个DataSet+TFRecords加载变长样本的范例. 首先先把变长的数据写入到TFRecords文件: def

  • Tensorflow 2.4加载处理图片的三种方式详解

    目录 前言 数据准备 使用内置函数读取并处理磁盘数据 自定义方式读取和处理磁盘数据 从网络上下载数据 前言 本文通过使用 cpu 版本的 tensorflow 2.4 ,介绍三种方式进行加载和预处理图片数据. 这里我们要确保 tensorflow 在 2.4 版本以上 ,python 在 3.8 版本以上,因为版本太低有些内置函数无法使用,然后要提前安装好 pillow 和 tensorflow_datasets ,方便进行后续的数据加载和处理工作. 由于本文不对模型进行质量保证,只介绍数据的加

  • TensorFlow安装并在Pycharm搭建环境的详细图文教程

    目录 Anaconda安装: TensorFlow安装: 1.打开Anaconda Prompt 2.在Anaconda Prompt中输入 3.等待电脑配置一会,出现Proceed([y]/n)?  输入y,按下回车 4.输入以下命令,进入tensorflow1环境 5.输入以下命令,安装英伟达的SDK10.1版本 6.输入以下命令,安装英伟达深度学习软件包7.6版本 7.使用以下语句,安装tensorflow 验证TensorFlow是否安装成功: Pycharm环境配置 总结 Anacon

  • Tensorflow2.1实现文本中情感分类实现解析

    目录 前言 实现过程和思路解析 下载影评数据并进行 padding 处理 创建验证集数据 搭建简单的深度学习模型 配置并编译模型 训练模型 评估模型 前言 本文主要是用 cpu 版本的 tensorflow 2.1 搭建深度学习模型,完成对电影评论的情感分类任务. 本次实践的数据来源于IMDB 数据集,里面的包含的是电影的影评,每条影评评论文本分为积极类型或消极类型.数据集总共包含 50000 条影评文本,取该数据集的 25000 条影评数据作为训练集,另外 25000 条作为测试集,训练集与测

  • 基于循环神经网络(RNN)实现影评情感分类

    使用循环神经网络(RNN)实现影评情感分类 作为对循环神经网络的实践,我用循环神经网络做了个影评情感的分类,即判断影评的感情色彩是正面的,还是负面的. 选择使用RNN来做情感分类,主要是因为影评是一段文字,是序列的,而RNN对序列的支持比较好,能够"记忆"前文.虽然可以提取特征词向量,然后交给传统机器学习模型或全连接神经网络去做,也能取得很好的效果,但只从端对端的角度来看的话,RNN无疑是最合适的. 以下介绍实现过程. 一.数据预处理 本文中使用的训练数据集为https://www.c

  • 把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数

    这几天在写一个小程序的时候,需要用到正则表达式匹配用户输入文本中的URL地址,然后将URL地址替换成可以点击的链接.URL地址的匹配,我想这应该是大家在做验证处理中常会用到的,这里就把我整合的一个比较完整的表达式给出来: 复制代码 代码如下: var URL = /(https?:\/\/|ftps?:\/\/)?((\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(:[0-9]+)?|(localhost)(:[0-9]+)?|([\w]+\.)(\S+)(\w{2,4}

  • Java正则表达式实现在文本中匹配查找换行符的方法【经典实例】

    本文实例讲述了Java正则表达式实现在文本中匹配查找换行符的方法.分享给大家供大家参考,具体如下: 默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTILINE 模式中时,$ 仅在行结束符之前或输入序列的结尾处匹配. NLMatch.java: package nlMatch; import java.util.regex.Pattern; /**

  • iOS 检测文本中的URL、电话号码等信息

    要检测文本中的 URL.电话号码等,除了用正则表达式,还可以用 NSDataDetector. 用 NSTextCheckingResult.CheckingType 初始化 NSDataDetector 调用 NSDataDetector 的 matches(in:options:range:) 方法获得 NSTextCheckingResult 数组 遍历 NSTextCheckingResult 数组,根据类型获取相应的检测结果,通过 range 获取结果文本在原文本中的位置范围(NSRa

  • asp.net 数据绑定 使用eval 时候报 字符文本中的字符太多 问题的解决方法

    在使用datalist 数据绑定时: 复制代码 代码如下: <asp:TextBox ID="txtOutPlace" runat="server" Text ="<%#Eval('调出单位存放地点')%>" Width="130px"></asp:TextBox> 运行报"字符文本中的字符太多"的错误,这时是因为Eval必须是字符串(""引起来)不能

  • PHP实现把文本中的URL转换为链接的auolink()函数分享

    其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP代码如何实现将URL地址转化成链接的方法,今天给大家介绍一个更加简洁的版本,先来看看PHP的源代码: auolink() API 复制代码 代码如下: /** * Author: SeeDZ * From: http://code.seebz.net/p/autolink-php/ **/ function autolink($str, $attributes = array()) {  

  • python统计一个文本中重复行数的方法

    本文实例讲述了python统计一个文本中重复行数的方法.分享给大家供大家参考.具体实现方法如下: 比如有下面一个文件 2 3 1 2 我们期望得到 2,2 3,1 1,1 解决问题的思路: 出现的文本作为key, 出现的数目作为value,然后按照value排除后输出 最好按照value从大到小输出出来,可以参照: 复制代码 代码如下: in recent Python 2.7, we have new OrderedDict type, which remembers the order in

  • Python判断文本中消息重复次数的方法

    本文实例讲述了Python判断文本中消息重复次数的方法.分享给大家供大家参考,具体如下: #coding:gbk ''' Created on 2012-2-3 从文件中读取文本,并判断文本中形如"message0"."message123"这样的消息有多少条是重复的 @author: Administrator ''' import re if __name__ == '__main__': pattern = u"(message((\d)+))&qu

  • 使用java从乱码文本中解析出正确的文本

    这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充,因此正确的文本使用的字节数应该是最少的(之一). 复制代码 代码如下: package com.hongyuan.test; import java.io.UnsupportedEncodingException; /* * 这是一个可以从乱码文本中得到正确的原始文本的程序,其基于的原理在于错误的编码往往导致位补充, * 因此正确的文本使用的字节数应该是最少的(之一). *  * 如果你在测试此程序时,无

随机推荐