NLP任务:情感分析、看图说话

我可不向其他博主那样拖泥带水,我有代码就直接贴在文章里,或者放到gitee供你们参考下载,虽然写的不咋滴,废话少说,上代码。

gitee码云地址:

卢东艺/pytorch_cv_nlp - 码云 - 开源中国 (gitee.com)icon-default.png?t=N7T8https://gitee.com/Ludongyi/pytorch_cv_nlp

一、情感分析

外卖评论(好评坏评)二分类

用线性模型来做比较简单,就是个简单的二分类,模型代码如下:

用RNN模型来做,可用RNN,GRU,LSTM模型,对于这种简单二分类模型,随便选一个都得,后面复杂的模型才考虑其他。

由图可以看出,训练20次,损失值一直在下降,然后开始震荡并逐渐收敛,训练的准确率一直在上升,当到达20次时,训练的准确率达到97%,进行模型测试,测试准确率只有86%,很明显的过拟合现象,不用慌,自己解决。

二、看图说话

Image Caption多模态任务,根据图片生成描述文字

数据集:

Flickr30k数据集是一个基于Flickr网站的数据集,它包括了31000张图像和每张图像准确的5个人工标注语句。该数据集的图像类型

非常丰富,从日常生活场景到复杂的社会场景都有涉及,本文只使用5条标注语句的第一条作为计算损失函数的输入。
下载地址:Flickr30k图像标注数据集下载及使用方法_flickr30k下载-CSDN博客

网络模型结构:

编码器部分

vgg16的卷积模块进行提取特征:

解码器部分

模型的训练结果如下:

在英伟达P4000显卡的加持下,每轮训练需要7分钟,128批次, 21轮训练损失值才降到1 ,可见这个模型还是有些复杂的,没有好的显卡的人可以去AutoDL算力云 租算力来跑。

测试案例:

一只白色的狗一只狗站在他面前看着嘴里的棍子

从网上下载一张图片进行预测,从预测的结果可以看出,预测的描述有点错误,分析原因,可能是整个网络还不够复杂,vgg16网络没有很好提取狗的嘴巴特征,LSTM预测的词不是很好。额,什么狗屁预测。

改进模型:

增加注意力机制: 在LSTM中引入注意力机制,使模型能够动态地关注图像中不同区域的信息,从而改善生成描述的精度和连贯性......

避坑

建议训练和测试都放到一个程序里,也就是训练完毕接着测试显示结果。我的代码是训练和测试分开的,是不同的进程。然后我发现每次运行词典都不一样,每次都会有不一样的id和乱序,这会造成一个问题,训练一半保存参数,下次加载模型参数重新训练时导致损失值很高而难以下降,因为词典的序号都变了,上次训练的参数语义信息不适用当前。还有如果你训练和测试都效果不错,过几天后发现预测效果很差,可能是一不小心运行数据处理部分,生成了新的词典了。所以,需要保存词典,而且只保存一次,下次加载处理接着用该词典,固定住词典。

在词典里没有的词模型是预测不出来的,所以如果发现模型预测的效果差,可能是词典里的单词少了,可以到网上找常用的英语单词5万个,搞成一个大的词典 .pkl格式,保存起来,方便自然语言处理的学习使用。

统计正确率:

 生成的文本与目标的文本如何才能判断是预测对的,太难判断了。就算计算两个文本的相似度,相似度大于0.5正确,小于则错误,但是,以上面的图片为例子,目标文本是两只小狗亲嘴,如果生成了草地的预测文本,相似度为0 ,但是你能说它预测不正确吗,草地也属于图片的潜在描述之一。

所以,这里不统计正确率。

深度学习之Image captioning的评分指标篇(BLEU、CIDEr)_bleu和cider-CSDN博客

python中计算BLEU分数_python 计算blue分数-CSDN博客

创新点:

1.动态调参技术

训练模型时参数是固定的,也就是一旦运行代码,就只能看着输出的结果,而不能手动改变里面的参数,如果在训练时发现损失值已经震荡收敛了,还继续训练这就造成资源的浪费,所以,这就要人为的进行控制调参,使程序能正常运行又不浪费资源。

本模型采用tkinter库进行GUI调参,控制模型的训练次数和学习率。

界面如图所示:

开一个线程,运行调参窗口,里面设置模型需要改变的重要参数。如学习率初始值为0.003,训练次数初始值为30。训练过程观测损失值的变化,如果损失值的改变量变小了,就把学习率调小为0.001甚至更小 ;如果损失值开始震荡收敛,就把训练次数改为当前轮的值,使训练完当前轮后就自然退出模型的训练,进行测试;如果训练了30次后损失值还有下降的趋势,就增大训练次数。

虽然GUI调参很方便,但多开一个线程也耗费了一定的资源,而且,这方法只适合有模型训练经验的人,有经验的调参大师。

2.训练过程提醒技术

有时候模型训练的时间需要很久,训练模型的人应该不会一直看着模型的训练过程,这时候需要需要一项提醒技术,每训练完一轮或者全部训练完毕,可以提醒训练者。

WxPusher微信消息推送服务介绍:WxPusher (微信推送服务)是一个使用微信公众号作为通道的,实时信息推送平台,你可以通过调用API的方式,把信息推送到微信上,无需安装额外的软件,即可做到信息实时通知。 你可以使用WxPusher来做服务器报警通知、抢课通知、抢票通知,信息更新提示等。 WxPusher微信推送服务

用户收到消息后,微信会响通知铃声,用户进入微信查看具体消息文字。

参考:shenxiaohai.me/pytorch-tutorial-advanced-04/

三、经验分享

数据处理类 继承 Dataset类,然后要写 def __len__() 和 def __getitem__(item)这两个特殊函数。def __len__()函数返回的是处理数据的大小,可以把它看成是循环调用def __getitem__(item)函数的次数,比如返回的是10,就调用10次__getitem__函数,__getitem__处理并返回了10个数据。

设计模型时先训练一批次的数据  (Dataset类里def __len__()返回batch_size大小,把模型设计好后,保证能正常运行出结果,再用全部数据。

策略:写代码时__len__()函数返回的大小分别采用一批次,一半,全部。

假如你一下子处理了全部数据,开始设计模型,运行,处理数据跑了一分钟,模型报了一个错,你修改模型代码,跑了一分钟,又报了一个错,又修改......等你能正确运行代码,浪费了很多时间。而刚开始就只处理一批数据,一下子就能出结果。所以我写代码刚开始只用一批次是验证代码能不能正常运行。

代码能正常运行了,我就把数据量增大到一半,用来验证模型的损失值和正确率是否正常,是否出现过拟合现象,模型是否需要改进......没问题后,我就处理完全部数据,继续增大训练,再观察效果,最后完工。

嫌数据集数量多,先不着急删除(万一突然想要用到),先只处理一部分数据训练看看效果,最后再决定删不删除。

要加检测损失值,连续2次震荡就停止训练,记得每隔几次保存一次模型参数,不然中途退出就白干。

训练集和验证集都计算损失值和准确率,观测数据之间的变化。

其他的经验自己多跑模型就能总结出来,跳过很多坑的过来人默默留下了眼泪(手动狗头)

未完待续...... 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 儿童绘本/汉语拼音实现

有这样一个项目&#xff0c;开发一个电子绘本&#xff0c;需要在绘本上显示&#xff0c;汉语拼音。 界面布局 <androidx.core.widget.NestedScrollViewandroid:layout_width"match_parent"android:layout_height"match_parent"android:fillViewport&quo…

ENSP实现防火墙区域策略与用户管理

目录 实验拓扑与要求​编辑 交换机与防火墙接口的配置 交换机&#xff1a; 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置​编辑​编辑​编辑 在浏览器上使用https协议登陆防火墙&#xff0c;并操作 访问网址&#xff1a;https://192.168.100.1:844…

Iceberg概念和特性

1. 快照 Iceberg会随着时间的推进,跟踪表生命周期中的所有数据集变化,并使用快照(Snapshots)来表示每一次变化后的数据集合,每一次数据操作的事务提交均会产生一个快照,并将其记录在元数据文件(Metadata)中。 基于快照的概念,Iceberg有以下特性: 事务性:写入快照成…

TS真的比JS更好吗?

前言 在讨论TypeScript&#xff08;TS&#xff09;是否比JavaScript&#xff08;JS&#xff09;更好时&#xff0c;我们需要明确“更好”这一概念的上下文和衡量标准。TypeScript和JavaScript在多个方面有着明显的区别&#xff0c;但它们并不是简单的“好”与“不好”的关系&a…

java实战项目-学生管理系统(附带全套源代码)--《基础篇》

一、前言 第一个java小型学生管理系统&#xff0c;思路和其他语言都一样&#xff0c;因为有C语言的基础&#xff0c;写这个并不是太难&#xff0c;不过&#xff0c;进阶篇的就难太多了。明天晚上更新进阶篇&#xff0c;因为目前代码还没有完善&#xff0c;保守估计需要500行代…

javaweb学习day5--《HTML篇》Springboot的模块创建、HTML的相关知识点详解

一、前言 从今天开始&#xff0c;就要启动后端的学习了&#xff0c;Springboot会贯穿到底&#xff0c;一定要跟着小编严谨的去搭建Springboot环境&#xff0c;依赖添加的过程可能需要2分钟左右&#xff0c;读者们要耐心等待一下&#xff0c;搭建好Springboot之后才算正式的开始…

【JavaWeb程序设计】Servlet(二)

目录 一、改进上一篇博客Servlet&#xff08;一&#xff09;的第一题 1. 运行截图 2. 建表 3. 实体类 4. JSP页面 4.1 login.jsp 4.2 loginSuccess.jsp 4.3 loginFail.jsp 5. mybatis-config.xml 6. 工具类&#xff1a;创建SqlSessionFactory实例&#xff0c;进行 My…

fortran简单排序算法,对一维、二维矩阵进行正序或倒序排序

fortran简单排序算法&#xff0c;对一维、二维矩阵进行正序或倒序排序 0. 引言1. 算法实现1.1 一维数组排序1.2 二维数组排序1.2 module文件 2. 结语 0. 引言 排序算法是计算机科学中的一项重要技术&#xff0c;它将一组数据按照特定的顺序排列起来。排序算法有很多种&#xff…

Three.js相机简明教程

相机校准是 3D 计算机图形学中的一个基本概念&#xff0c;涉及设置虚拟相机以模拟真实世界相机的视角和行为。在 Three.js&#xff08;一种流行的 3D 渲染 JavaScript 库&#xff09;中&#xff0c;了解相机校准对于创建逼真且身临其境的 3D 场景至关重要。在本文中&#xff0c…

2、ASPX、.NAT(环境/框架)安全

ASPX、.NAT&#xff08;环境/框架&#xff09;安全 源自小迪安全b站公开课 1、搭建组合&#xff1a; WindowsIISaspxsqlserver .NAT基于windows C开发的框架/环境 对抗Java xx.dll <> xx.jar 关键源码封装在dll文件内。 2、.NAT配置调试-信息泄露 功能点&#xf…

《Linux系统编程篇》Visual Studio Code配置下载,中文配置,连接远程ssh ——基础篇

引言 vscode绝对值得推荐&#xff0c;非常好用&#xff0c;如果你能体会其中的奥妙的话。 工欲善其事&#xff0c;必先利其器 ——孔子 文章目录 引言下载VS Code配置VS Code中文扩展连接服务器 连接服务器测试确定服务器的IP地址VS code 配置ssh信息选择连接到主机选择这个添…

【D3.js in Action 3 精译】1.3 D3 视角下的数据可视化最佳实践(下)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 ✔️ 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 与 JavaScript 框架1.2.7 Observable 记事…

go-高效处理应用程序数据

一、背景 大型的应用程序为了后期的排障、运营等&#xff0c;会将一些请求、日志、性能指标等数据保存到存储系统中。为了满足这些需求&#xff0c;我们需要进行数据采集&#xff0c;将数据高效的传输到存储系统 二、问题 采集服务仅仅针对某个需求开发&#xff0c;需要修改…

Profibus协议转Profinet协议网关模块连接智能电表通讯案例

一、背景 在工业自动化领域&#xff0c;Profibus协议和Profinet协议是两种常见的工业通讯协议&#xff0c;而连接智能电表需要用到这两种协议之间的网关模块。本文将通过一个实际案例&#xff0c;详细介绍如何使用Profibus转Profinet模块&#xff08;XD-PNPBM20&#xff09;实…

Kubernetes 为pod指定DNS

在k8s里面&#xff0c;默认创建pod会给pod默认分配一个默认的dns&#xff0c;这个dns是哪来的呢&#xff1f;可不可以改成其他的dns呢&#xff1f; 先进入到pod里面来&#xff0c;可以看到这里面默认设置的DNS服务器&#xff0c;这个服务器地址为10.96.0.10。这个地址是k8s自动…

[web]-图片上传、文件包含-图片上传

题目内容提示&#xff1a;上传图片试试吧&#xff0c;注意统一时区问题 打开页面如图&#xff0c;源码没有过滤&#xff0c;随便输入&#xff0c;进入上传目录 根据链接可以看到是文件包含&#xff0c;可以利用编码读取源码&#xff0c;这里只列出有用页面的编码&#xff08;?…

一文入门【NestJs】Providers

Nest学习系列 ✈️一文入门【NestJS】 ✈️一文入门【NestJs】Controllers 控制器 &#x1f6a9; 前言 在NestJS的世界里&#xff0c;理解“Providers”是构建健壮、可维护的后端服务的关键。NestJS&#xff0c;作为Node.js的一个现代框架&#xff0c;采用了Angular的一些核…

科普文:微服务技术栈梳理

概叙 如上两图所示&#xff0c;微服务架构下&#xff0c;需要的组件很多&#xff0c;上面中也并未列全。下面将梳理一下国内微服务架构下&#xff0c;用到的技术栈&#xff0c;仅供参考。 科普文&#xff1a;12种常见的软件架构-CSDN博客 没有最好的架构&#xff0c;只有最适…

基于springboot+vue+uniapp的机电公司管理信息系统

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

【C++】 List 基本使用

C List 基本使用 基本概念 list 是一个序列容器&#xff0c;它内部维护了一个双向链表结构。与 vector 或 deque 等基于数组的容器不同&#xff0c;list 在插入和删除元素时不需要移动大量数据&#xff0c;因此在这些操作上具有较高的效率。然而&#xff0c;访问列表中的特定…