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.mzph.cn/bicheng/45835.shtml

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

相关文章

初始c语言 语句

一 认识语句 控制流语句 if-else语句:用于条件判断。for循环语句:用于循环执行一段代码。while循环语句:当条件为真时执行循环。do-while循环语句:先执行一次循环体,然后再判断条件。switch语句:根据不同的…

CEPH 硬盘读写慢问题影响

ceph使用时经常会碰到起不来的情况 第一种就是服务器负载高,这个基本都会觉察到 还有一种就是硬盘问题 硬盘写问题 初始化时ceph会自己进行填充操作 ceph-volume lvm zap /dev/sdx --destroy 我就碰到过没初始化问题 看着一切正常 但看写入速度才几百KB/s 正常都100…

ArrayList模拟实现

ArrayList模拟实现 ArrayList 的初步介绍常见操作 ArrayList 的简单模拟实现 ArrayList 的初步介绍 ArrayList也叫做顺序表,底层是一个数组。 在创建顺序表 时就应该规定 里面元素的数据类型,其中不能直接传基本数据类型,例如int、char。需要…

Java代码初始化块

目录 实例域代码块 静态域代码块 初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以有多个代码块。 实例域代码块 使用方法 可以有输出语句 可以对类的属…

vue实现a-model弹窗拖拽移动

通过自定义拖拽指令实现 实现效果 拖动顶部,可对整个弹窗实施拖拽(如果需要拖动底部、中间内容实现拖拽,把下面的ant-modal-header对应改掉就行) 代码实现 编写自定义指令 新建一个ts / js文件,用ts举例 import V…

基于modbus tcp通讯的雷赛导轨控制器调试软件

0.前言 之前工作遇到了雷赛电机驱动器设备,主要是用来控制光学导轨移动。雷赛的调试软件用的时串口通讯,还要他们定制的串口线,在现场都是485转网络的接口,调试起来也很不方便。所以我就照着他们的说明书,写了一个简易…

Vue3 引入Vanta.js使用

能搜到这篇文章 想必一定看过demo效果图了吧 示例 Vanta.js - Animated 3D Backgrounds For Your Website (vantajs.com) 1. 引入 在根目录 index.html中引入依赖 <script src"https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></sc…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现:7000字论文+源代码参考

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…

底软驱动 | U-boot移植点点滴滴

u-boot 移植要点 一般厂家直接提供 u-boot 源码&#xff0c;做查看、修改(增加新功能) 或 u-boot 版本升级这三大块的用处&#xff1b;后两种都需要对新板子做适配/移植。 如果没有提供 u-boot 源码&#xff0c;那么就从 u-boot 官方版本中找到一个最相近的板子配置进行移植&…

【QT】布局管理器

布局管理器 布局管理器1. 垂直布局2. 水平布局3. 网格布局4. 表单布局5. Spacer 布局管理器 之前使⽤ Qt 在界⾯上创建的控件, 都是通过 “绝对定位” 的⽅式来设定的&#xff1b;也就是每个控件所在的位置, 都需要计算坐标, 最终通过 setGeometry 或者 move ⽅式摆放过去。 …

排序-java(详解)

一&#xff0c;分类 主要的排序大致分为以下几类&#xff1a; 1&#xff0c;插入排序&#xff0c;又分为直接插入排序和希尔排序 2&#xff0c;选择排序&#xff0c;又分为选择排序和堆排序 3&#xff0c;交换排序&#xff0c;又分为冒泡排序和快速排序 4&#xff0c;归并…

【linux】服务器安装及卸载pycharm社区版教程

【linux】服务器安装及卸载pycharm社区版教程 【创作不易&#xff0c;求点赞关注收藏】 文章目录 【linux】服务器安装及卸载pycharm社区版教程1、到官网下载安装包2、通过终端wget下载安装包3、解压4、安装5、设置环境变量6、运行pycharm7、删除pycharm安装包、卸载pycharm …

从“卷模型”到“卷应用”:AI时代的价值重塑与个性化智能探索

&#x1f308;所属专栏&#xff1a;【其它】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

【漏洞复现】华测监测预警系统2.2 UserEdit.aspx SQL注入

声明&#xff1a;本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动&#xff0c;将与本文档的作者或发布者无关。 一、漏洞描述 华测监测预警系统2.2&#xff08;HuaCe Monitoring and Early Warning System 2.2&#xff09;是一款由华…

人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程9-PyTorch神经网络之全连接神经网络实战与代码详解。本文将给大家展示全连接神经网络与代码详解&#xff0c;包括全连接模型的设计、数学原理介绍&#xff0c;并从手写数字识别到猫狗识…

【第32章】MyBatis-Plus之代码生成器配置

文章目录 前言一、概述1.特点说明2.示例配置3. 数据库配置 (DataSourceConfig) 二、全局配置 (GlobalConfig)1.方法说明2.示例配置 三、包配置 (PackageConfig)1. 方法说明2. 示例配置 四、模板配置 (TemplateConfig)1. 方法说明2. 示例配置 五、注入配置 (InjectionConfig)1. …

使用 exe4j 转换 Java jar 程序为 Windows 平台可执行文件 (.exe)

使用 exe4j 转换 Java jar 程序为 Windows 平台可执行文件 &#xff08;.exe&#xff09; 介绍exe4j 特点&#xff1a;转换全过程&#xff08;软件操作&#xff09;1、注册2、选择模式3、配置应用4、选择执行的方式&#xff08;我这里管这个叫呈现方式&#xff09;5、选择 JAR …

Java 中的正则表达式

转义字符由反斜杠\x组成&#xff0c;用于实现特殊功能当想取消这些特殊功能时可能在前面加上反斜杠\ 例如在Java中\也具有特殊意义&#xff0c;前面加一个反斜杠表示取消特殊意义&#xff0c;表示1个普通的反斜杠\&#xff0c;\\\\表示2个普通的反斜杠\\。其实就是要求Java中的…

Python那些优质可视化工具!

作者&#xff1a;Lty美丽人生 https://blog.csdn.net/weixin_44208569 本次分享10个适用于多个学科的Python数据可视化库&#xff0c;其中有名气很大的也有鲜为人知的&#xff01; 1、matplotlib 两个直方图 matplotlib 是Python可视化程序库的泰斗。经过十几年它任然是Pytho…

【前端速通系列|第二篇】Vue3前置知识

文章目录 1.前言2.包管理工具npm2.1下载node.js2.2配置 npm 镜像源2.3 npm 常用命令 3.Vite构建工具4.Vue3组件化5.Vue3运行原理 1.前言 本系列文章旨在帮助大家快速上手前端开发。 2.包管理工具npm npm 是 node.js中进行 包管理 的工具. 类似于Java中的Maven。 2.1下载nod…