【人工智能Ⅱ】实验5:自然语言处理实践(情感分类)

news2024/12/23 16:54:06

实验5:自然语言处理实践(情感分类)

一:实验目的与要求

1:掌握RNN、LSTM、GRU的原理。

2:学习用RNN、LSTM、GRU网络建立训练模型,并对模型进行评估。

3:学习用RNN、LSTM、GRU网络做预测。

二:实验内容

选择公开数据集,用LSTM、GRU或相应的改进模型实现情感分类。

如:IMDB电影评论数据集,IMDB是一个对电影评论标注为正向评论与负向评论的数据集,共有25000条文本数据作为训练集,25000条文本数据作为测试集。百度平台该数据集已经经过预处理:评论(单词序列)已经被转换为整数序列,其中每个整数代表字典中的某个单词。

三:实验环境

本实验所使用的环境条件如下表所示。

操作系统

Ubuntu(Linux)

程序语言

Python(3.8.10)

第三方依赖

numpy, matplotlib,keras等

四:方法流程

1:使用imdb.load_data编写数据加载代码,设置相关参数,例如max_features、maxlen、batch_size等。

2:编写LSTM和GRU模型的网络代码,并打印网络结构进行分析。

3:编写上述RNN模型编译、训练和测试的代码。

4:根据训练结果进行可视化绘图,例如损失值和准确率。

5:根据实验结果,对比上述RNN模型。

五:实验展示(训练过程的数据打印和可视化、测试和应用的结果展示)

1:GRU模型的实现

GRU模型的代码搭建如下表所示。

model = models.Sequential()

model.add(layers.Embedding(max_features, 32, input_length = maxlen))

model.add(layers.Conv1D(32, 5, activation = 'relu'))

model.add(layers.MaxPooling1D(3))

model.add(layers.Conv1D(32, 5, activation = 'relu'))

model.add(layers.MaxPooling1D(3))

model.add(layers.Dropout(0.2))

model.add(layers.CuDNNGRU(32))  # return_sequences = False

model.add(layers.Dense(1, activation = 'sigmoid'))


通过【model.summary()】打印GRU模型的网络结构,如下图所示。由下图可知,GRU模型的训练参数量为336673。

在模型编译环节,由于情感分析只需要分类为正向情绪positive(符号化为1)和负向情绪negative(符号化为0),因此GRU模型采用二分类交叉熵(binary_crossentropy)作为损失函数。同时,优化器选用rmsprop,评价指标选用准确率。

在模型训练环节,批次大小选为32,迭代次数选为15,验证集在输入训练集中的占比为20%。GRU模型的训练过程如下表所示。

Epoch 1/15

625/625 [==============================] - 31s 10ms/step - loss: 0.5597 - acc: 0.6617 - val_loss: 0.2946 - val_acc: 0.8784

Epoch 2/15

625/625 [==============================] - 6s 10ms/step - loss: 0.2560 - acc: 0.8980 - val_loss: 0.2974 - val_acc: 0.8778

Epoch 3/15

625/625 [==============================] - 6s 9ms/step - loss: 0.1908 - acc: 0.9268 - val_loss: 0.2786 - val_acc: 0.8842

Epoch 4/15

625/625 [==============================] - 6s 9ms/step - loss: 0.1511 - acc: 0.9433 - val_loss: 0.3029 - val_acc: 0.8822

Epoch 5/15

625/625 [==============================] - 6s 10ms/step - loss: 0.1237 - acc: 0.9564 - val_loss: 0.2970 - val_acc: 0.8898

Epoch 6/15

625/625 [==============================] - 6s 10ms/step - loss: 0.0941 - acc: 0.9675 - val_loss: 0.3680 - val_acc: 0.8750

Epoch 7/15

625/625 [==============================] - 8s 12ms/step - loss: 0.0716 - acc: 0.9766 - val_loss: 0.3606 - val_acc: 0.8806

Epoch 8/15

625/625 [==============================] - 6s 10ms/step - loss: 0.0428 - acc: 0.9870 - val_loss: 0.4644 - val_acc: 0.8740

Epoch 9/15

625/625 [==============================] - 6s 9ms/step - loss: 0.0266 - acc: 0.9916 - val_loss: 0.4629 - val_acc: 0.8736

Epoch 10/15

625/625 [==============================] - 7s 10ms/step - loss: 0.0154 - acc: 0.9954 - val_loss: 0.5867 - val_acc: 0.8754

Epoch 11/15

625/625 [==============================] - 7s 12ms/step - loss: 0.0087 - acc: 0.9976 - val_loss: 0.6492 - val_acc: 0.8770

Epoch 12/15

625/625 [==============================] - 8s 12ms/step - loss: 0.0076 - acc: 0.9984 - val_loss: 0.8017 - val_acc: 0.8686

Epoch 13/15

625/625 [==============================] - 8s 12ms/step - loss: 0.0057 - acc: 0.9988 - val_loss: 0.9574 - val_acc: 0.8700

Epoch 14/15

625/625 [==============================] - 8s 12ms/step - loss: 0.0043 - acc: 0.9989 - val_loss: 0.9877 - val_acc: 0.8722

Epoch 15/15

625/625 [==============================] - 7s 11ms/step - loss: 0.0019 - acc: 0.9996 - val_loss: 1.0454 - val_acc: 0.8652

针对上述训练结果,利用plt绘制曲线变化图。

GRU模型的训练损失值和验证损失值,如下图所示。

GRU模型的训练准确率和验证准确率,如下图所示。

 基于利用数据集训练过后的模型,在测试集上进行测试,结果如下图所示。最终的测试准确率为:84.70%。

2:LSTM模型的实现

LSTM模型的代码搭建如下表所示。

model = models.Sequential()

model.add(layers.Embedding(max_features, 32, input_length = maxlen))

model.add(layers.Dropout(0.2))

model.add(layers.CuDNNLSTM(32))  # return_sequences = False

model.add(layers.Dense(1, activation = 'sigmoid'))


通过【model.summary()】打印GRU模型的网络结构,如下图所示。由下图可知,LSTM模型的训练参数量为328481。

在模型编译环节,由于情感分析只需要分类为正向情绪positive(符号化为1)和负向情绪negative(符号化为0),因此GRU模型采用二分类交叉熵(binary_crossentropy)作为损失函数。同时,优化器选用rmsprop,评价指标选用准确率。

在模型训练环节,批次大小选为32,迭代次数选为15,验证集在输入训练集中的占比为20%。GRU模型的训练过程如下表所示。

Epoch 1/15

625/625 [==============================] - 18s 27ms/step - loss: 0.5685 - acc: 0.6912 - val_loss: 0.3342 - val_acc: 0.8610

Epoch 2/15

625/625 [==============================] - 17s 27ms/step - loss: 0.2768 - acc: 0.8936 - val_loss: 0.2835 - val_acc: 0.8870

Epoch 3/15

625/625 [==============================] - 16s 26ms/step - loss: 0.2250 - acc: 0.9143 - val_loss: 0.3460 - val_acc: 0.8634

Epoch 4/15

625/625 [==============================] - 15s 24ms/step - loss: 0.2012 - acc: 0.9244 - val_loss: 0.3467 - val_acc: 0.8796

Epoch 5/15

625/625 [==============================] - 16s 26ms/step - loss: 0.1847 - acc: 0.9314 - val_loss: 0.2746 - val_acc: 0.8916

Epoch 6/15

625/625 [==============================] - 16s 25ms/step - loss: 0.1696 - acc: 0.9402 - val_loss: 0.3191 - val_acc: 0.8808

Epoch 7/15

625/625 [==============================] - 15s 25ms/step - loss: 0.1641 - acc: 0.9403 - val_loss: 0.2730 - val_acc: 0.8960

Epoch 8/15

625/625 [==============================] - 15s 25ms/step - loss: 0.1609 - acc: 0.9429 - val_loss: 0.2994 - val_acc: 0.8942

Epoch 9/15

625/625 [==============================] - 16s 25ms/step - loss: 0.1518 - acc: 0.9450 - val_loss: 0.2790 - val_acc: 0.8924

Epoch 10/15

625/625 [==============================] - 16s 26ms/step - loss: 0.1315 - acc: 0.9551 - val_loss: 0.3164 - val_acc: 0.8740

Epoch 11/15

625/625 [==============================] - 15s 25ms/step - loss: 0.1341 - acc: 0.9521 - val_loss: 0.2852 - val_acc: 0.8972

Epoch 12/15

625/625 [==============================] - 16s 25ms/step - loss: 0.1223 - acc: 0.9568 - val_loss: 0.3203 - val_acc: 0.8924

Epoch 13/15

625/625 [==============================] - 16s 26ms/step - loss: 0.1170 - acc: 0.9599 - val_loss: 0.2889 - val_acc: 0.8920

Epoch 14/15

625/625 [==============================] - 16s 26ms/step - loss: 0.1029 - acc: 0.9637 - val_loss: 0.3150 - val_acc: 0.8872

Epoch 15/15

625/625 [==============================] - 16s 25ms/step - loss: 0.1008 - acc: 0.9662 - val_loss: 0.3256 - val_acc: 0.8942

针对上述训练结果,利用plt绘制曲线变化图。

GRU模型的训练损失值和验证损失值,如下图所示。

GRU模型的训练准确率和验证准确率,如下图所示。

基于利用数据集训练过后的模型,在测试集上进行测试,结果如下图所示。最终的测试准确率为:87.72%。

3:GRU模型和LSTM模型的对比

基于本实验第1节和第2节部分的内容,可以得到:

(1)GRU模型的训练参数量为336673,而LSTM模型的训练参数量为328481。因此,GRU模型的训练参数量略多于LSTM模型。

(2)GRU模型在训练过程中的验证集上的最高准确率为88.98%,而LSTM模型在训练过程中的验证集上的最高准确率为89.72%。因此,GRU模型的验证准确率略低于LSTM模型。

(3)GRU模型最终的测试准确率为84.70%,而L,STM模型最终的测试准确率为87.72%。因此,GRU模型的测试准确率略低于LSTM模型。

    综上所述,GRU模型的效果比LSTM模型略差。

六:实验结论

1:斯坦福官方平台的IMDB电影评论数据集Large Movie Review Dataset v1.0(Sentiment Analysis)。

2:添加正则化项(如:dropout)可以有效防止模型过拟合,提高泛化能力。同时,选择合适的优化器(如:adam、rmsprop)可以加速模型的训练过程。

3:隐藏层单元数、学习率、批次大小等超参数的调整对于LSTM和GRU模型的表现性能具有显著影响。通过合理的超参数调整,可以进一步提高模型的性能。

4:GRU模型可以解决RNN中不能长期记忆和反向传播中的梯度等问题,但是比LSTM简单,容易进行训练。

5:在LSTM模型中,信息的添加和移除通过“门”结构来实现,“门”结构在训练过程中会去学习该保存或遗忘哪些信息。其中,LSTM模型具有三个门,遗忘门,输入门,输出门。

6:循环神经网络是时间上的展开,处理的是序列结构的信息。而递归神经网络是是空间上的展开,处理的是树状结构的信息。

7:电影评论情感分析的实践流程示意图,如下图所示。

七:遇到的问题和解决方法

    暂无。

八:程序源代码

    以下代码为GRN示例,LSTM可同理实现。完整代码可见ipynb附件。

import numpy as np

import matplotlib.pyplot as plt

from keras.datasets import imdb

from keras import models

from keras import layers

from keras.preprocessing.sequence import pad_sequences

max_features = 10000  # Only include top 10,000 words in the vocabulary

maxlen = 500  # Cut off each review after 500 words

batch_size = 32

(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words = max_features)

X_train.shape, X_test.shape

X_train = pad_sequences(X_train, maxlen = maxlen)

X_test = pad_sequences(X_test, maxlen = maxlen)

X_train.shape, X_test.shape

model = models.Sequential()

model.add(layers.Embedding(max_features, 32, input_length = maxlen))

model.add(layers.Conv1D(32, 5, activation = 'relu'))

model.add(layers.MaxPooling1D(3))

model.add(layers.Conv1D(32, 5, activation = 'relu'))

model.add(layers.MaxPooling1D(3))

model.add(layers.Dropout(0.2))

model.add(layers.CuDNNGRU(32))  # return_sequences = False

model.add(layers.Dense(1, activation = 'sigmoid'))

model.summary()

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

history = model.fit(X_train, y_train, batch_size = batch_size, epochs = 15, validation_split = 0.2)

loss = history.history['loss']

val_loss = history.history['val_loss']

acc = history.history['acc']

val_acc = history.history['val_acc']

epochs = range(1, 16)

plt.plot(epochs, loss, 'go', label = 'Training Loss')

plt.plot(epochs, val_loss, 'g', label = 'Validation Loss')

plt.xlabel('Epochs')

plt.ylabel('Loss')

plt.legend()

plt.show()

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

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

plt.xlabel('Epochs')

plt.ylabel('Accuracy')

plt.legend()

plt.show()

model.evaluate(X_test, y_test)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1642855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Photoshop中图像编辑的基本操作

Photoshop中图像编辑的基本操作 Photoshop中调整图像窗口大小Photoshop中辅助工具的使用网格的使用标尺的使用注释工具的使用 Photoshop中置入嵌入式对象Photoshop中图像与画布的调整画布大小的修改画布的旋转图像尺寸的修改 Photoshop中撤销与还原采用快捷键进行撤销与还原采用…

基于MQTT通信开发的失物招领小程序

项目架构设计 这个项目采用前后端分离的方式,重新设计了两条链路来支撑程序的信息获取和传递 前端的小程序页面再启动页面渲染时,直接通过DBAPI从后端数据库获取信息,直接渲染在小程序中项目中给DBAPI的定位是快速从后端获取信息&#xff0…

信息系统项目管理师0087:组织系统(6项目管理概论—6.2项目基本要素—6.2.6组织系统)

点击查看专栏目录 文章目录 6.2.6组织系统1.治理框架2.管理要素3.组织结构类型6.2.6组织系统 项目运行时会受到项目所在的组织结构和治理框架的影响与制约。为有效且高效地开展项目,项目经理需要了解组织内的组织机构及职责分配情况,帮助自己有效地利用其权力、影响力、能力、…

5分钟速通大语言模型(LLM)的发展与基础知识

✍️ 作者:哈哥撩编程(视频号同名) 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 🏆 推荐专栏: 🏅 程序员:职场关键角色通识宝…

【编程题-错题集】chika 和蜜柑(排序 / topK)

牛客对于题目链接&#xff1a;chika和蜜柑 (nowcoder.com) 一、分析题目 排序 &#xff1a;将每个橘⼦按照甜度由高到低排序&#xff0c;相同甜度的橘子按照酸度由低到高排序&#xff0c; 然后提取排序后的前 k 个橘子就好了。 二、代码 1、看题解之前AC的代码 #include <…

ttkbootstrap界面美化系列之PanedWindow(七)

在界面设计中经常用PanedWindow控件来对整个界面进行切割布局&#xff0c;让整个界面看上去有层次感&#xff0c;不至于说杂乱无章。在我之前的文章中有对tkinter的该控件做了详细的介绍&#xff0c;链接如下基于Tkinter的PanedWindow组件进行窗口布局-CSDN博客 本文主要是介绍…

Python-VBA函数之旅-oct函数

目录 一、oct函数的常见应用场景 二、oct函数使用注意事项 三、如何用好oct函数&#xff1f; 1、oct函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、oct函数的常见应用场景 oc…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

Linux理解文件操作 文件描述符fd 理解重定向 dup2 缓冲区 C语言实现自己的shell

文章目录 前言一、文件相关概念与操作1.1 open()1.2 close()1.3 write()1.4 read()1.4 写入的时候先清空文件内容再写入1.5 追加&#xff08;a && a&#xff09; 二、文件描述符2.1 文件描述符 fd 0 1 2 的理解2.2 FILE结构体&#xff1a;的源代码 三、深入理解文件描述…

Vue 开发中的一些问题简单记录,Cannot find module ‘webpack/lib/RuleSet‘

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

【C语言】项目实践-贪吃蛇小游戏(Windows环境的控制台下)

一.游戏要实现基本的功能&#xff1a; • 贪吃蛇地图绘制 • 蛇吃食物的功能 &#xff08;上、下、左、右方向键控制蛇的动作&#xff09; • 蛇撞墙死亡 • 蛇撞自身死亡 • 计算得分 • 蛇身加速、减速 • 暂停游戏 二.技术要点 C语言函数、枚举、结构体、动态内存管…

【Java探索之旅】内部类 静态、实例、局部、匿名内部类全面解析

文章目录 &#x1f4d1;前言一、内部类1.1 概念1.2 静态内部类1.3 实例内部类1.4 局部内部类1.5 匿名内部类 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;内部类是一种强大的特性&#xff0c;允许在一个类的内部定义另一个类&#xff0c;从而实现更好的…

Rust web简单实战

一、使用async搭建简单的web服务 1、修改cargo.toml文件添加依赖 [dependencies] futures "0.3" tokio { version "1", features ["full"] } [dependencies.async-std] version "1.6" features ["attributes"]2、搭…

网络攻击(Cyber Attacks)

目录 1.概念 2.分类 3.总结 1.概念 网络攻击&#xff08;Cyber Attacks&#xff0c;也称赛博攻击&#xff09;是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的&#xff0c;任何类型的进攻动作。对于计算机和计算机网络来说&#xff0c;破坏、揭露、修改、使…

【C++】STL — List的接口讲解 +详细模拟实现

前言&#xff1a; 本章我们将学习STL中另一个重要的类模板list… list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xf…

从零到屎山系列-游戏开发(Day2)

简介 这次就来一个比较简单的小游戏贪吃蛇 贪吃蛇 游戏规则就是一串珠子不断的移动&#xff0c;碰到场景里面的食物变长一点&#xff0c;碰到墙壁游戏结束。 开始动手 设计绘制设备 首先我计划从一个控制台游戏开始&#xff0c;需要一个控制台下的绘图机制&#xff0c;希…

基于Sen+MK的多站点不同季节和年尺度的SPEI趋势分析.md

再大的风浪&#xff0c;不过只短暂喧哗。 文章目录 前言1. 概述2.1 问题情景2.2 说明 2. 版本2.1 天津&#xff0c;2024年5月4日&#xff0c;Version1 3. 微信公众号GISRSGeography 一、数据1. 输入数据2. 输出数据 二、程序代码三、参考资料 前言 1. 概述 2.1 问题情景 假…

java-Spring-mvc-(请求和响应)

目录 &#x1f4cc;HTTP协议 超文本传输协议 请求 Request 响应 Response &#x1f3a8;请求方法 GET请求 POST请求 &#x1f4cc;HTTP协议 超文本传输协议 HTTP协议是浏览器与服务器通讯的应用层协议&#xff0c;规定了浏览器与服务器之间的交互规则以及交互数据的格式…

thinkphp6 workerman无法使用框架Db/model等类库方法解决方案

thinkphp6 workerman无法使用框架Db/model相关操作解决 执行安装相关扩展 composer require webman/gateway-worker引入成功后编辑服务类文件,直接展示代码 <?phpnamespace app\server\controller;use GatewayWorker\BusinessWorker; use GatewayWorker\Gateway; use Gate…

java异常.day30(Error,Exception)

Error和Exception说明 Error Error类及其子类表示的是Java虚拟机&#xff08;JVM&#xff09;无法或不应该尝试恢复的严重问题。这些问题通常是由JVM本身的问题、系统资源耗尽、或其他不可控的环境因素引起的。由于Error是不可恢复的&#xff0c;因此应用程序不应该尝试捕获和…