自动驾驶—— Image Caption的学习笔记(legacy)
1 前言
序列映射我们当前准备使用Transformer的结构;
2 致谢
感谢公众号《人工智能技术干货》提供的资料,《如何优雅的使用pytorch内置torch.nn.CTCLoss的方法》
让我收获了很棒的知识!
3 词表建立的规则
我们使用","作为统一的分隔符;
3.1 词典类——Vocab
我们使用set来作为词典的数据结构;
4 模型设计
3.1 backbone——rec_r34_vd
主干网络的设计我们是参考的PaddleOCR的识别模型,
代码的链接如下:
https://github.com/PaddlePaddle/PaddleOCR/blob/develop/ppocr/modeling/backbones/rec_resnet_vd.py
3.2 loss函数—— CTC Loss
CTC最初论文:
《Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks》
关于 CTC Loss函数的数学推导:
https://zhuanlan.zhihu.com/p/43534801
关于 CTC Loss中CTC动态规划的计算过程,可以参考 Deep Systems的PPT文档:
https://docs.google.com/presentation/d/12gYcPft9_4cxk2AD6Z6ZlJNa3wvZCW1ms31nhq51vMk/pub?start=false&loop=false&delayms=3000#slide=id.g24e9f0de4f_0_332
3.2.1 代码写作——torch.nn.
CTCLoss
我们使用PyTorch自带的CTCLoss;
CTCLoss的输入有两种方式:
padded和un-padded;
这里我们是推荐un-padded方式,因为不用预先做padding的操作,会方便一些,也更好理解;
nn.CTCLoss()参数说明:
blank——空白标识:
类似于一种占位符,在CTC-Loss中用来分隔两种字符区间,例如“ap-ple”,可以使用blank来分隔字符串中相同的元素;
我们在词典中也会加入<blank>字符,并将词典中的ID闯入到这里的blank参数中;
ctc_loss()参数说明:
参考代码是
loss = ctc_loss(output.log_softmax(2), target, input_lengths, target_lengths)
input——预测数组:
input模型的预测值,在输入到loss之前需要log_softmax(2);
targets——目标数组的长数组:
称它为长数组,是因为它是由目标值拼接而成的,拼接的方法是使用了“long_array += array”;
形象化的解释可以参考我发的博文,这里粘贴一下,
input_lengths——N维相同值的向量,:
input_lengths代表了所有输入序列的长度,由于这里我们使用的是CTCLoss,所以所有序列的长度都是相同的,即“时间长度T”;
5 模型调试
5.1 loss出现了“nan”——模型在计算时出现了数值溢出
5.1.1 由梯度爆炸引起的“nan”现象——而不是学习率lr过大引起的
梯度爆炸是会引起loss出现“nan”现象的,这是因为梯度在反向传播的过程中出现了“数值溢出”的问题,(这样的问题并不一定是代码的问题导致的)
观察点一:调小学习率之后,未出现梯度爆炸,说明不是loss计算的问题,而是梯度反向传播出现的问题;
观察点二:在使用最初大学习率时,会偶然出现“loss is nan”的情况,而不是每次训练都会出现,说明loss的前向计算不存在问题;
观察点三:使用最初大学习率时,模型有一定几率(例如50%)收敛的很好,说明学习率的设置不存在问题;
综上所述,这可能是由于模型存在大量的“全连接”结构,梯度在反向传递时,出现了多次的“乘法”运算而产生了梯度爆炸;
猜想:可以尝试使用梯度裁剪,来避免梯度回传时产生的数值溢出;
实验结果:使用梯度裁剪是可行的;
6 提问备忘
4.1 为什么Transformer不能指定输出encoding的大小呢?
今天在写作的时候,想到了这个问题,为什么Transformer不能指定输出encoding的大小呢?
我看了一下PyTorch的接口说明,的确是没有的,
然后请教了一下亮亮老师,老师说是因为PyTorch的实现版本没有提供这个功能,
他建议我看看OpenNMT-py,感谢亮亮老师!
自动驾驶—— Image Caption的学习笔记(legacy)相关推荐
- 自动驾驶—— Image Caption的学习笔记
3.2 loss函数-- CTC Loss CTC Loss是一个易于使用的loss函数: 3.2.1 原始CTC存在的问题 此图片来自于李宏毅老师的课程视频, 4 CTC的改进 4.1 RNN-T- ...
- 自动驾驶——多目标跟踪模块的学习笔记
1 系统状态模型 1.1 状态变量的定义 bbox:目标框位置: (在GoK的世界里,物体在没有外力的情况下速度为0) (class:检测模块会输出目标的类别) 备注: (loc_txt:如果信息量不 ...
- 自动驾驶——模型部署的学习笔记
2 剪枝 模型剪枝是很有效的,因为模型在初始化时会有很多的神经元,也就是"想的很多",通过剪枝可以消除一些作用小的神经元:
- 自动驾驶—全局定位的学习笔记
1 基于遗传算法的全局匹配方法 选取特征子算法,可以使用SIFT特征子: 使用遗传算法进行coarse匹配:
- 自动驾驶目标识别-----毫米波雷达学习笔记(1)
1.毫米波雷达介绍 1.1 什么是毫米波雷达 通常将波长为1-10毫米的电磁波称毫米波,车载毫米波雷达工作的频段为24GHz和77GHz,少数国家(如日本)采用60GHz频段.车载毫米波雷达通过天线向 ...
- 自动驾驶、无人驾驶、车联网笔记分享
持续更新整理一些自动驾驶领域.无人驾驶领域.车联网领域的优秀资源笔记,分享给有需要的人. 车路协同.车联网.智慧交通.智能网联车.自动驾驶.无人驾驶.高精度地图资料汇总与整理 车路协同优质资料整理地址 ...
- 自动驾驶汽车之深度学习 2018 MIT 6.S094 Deep Learning for Self-Driving Cars
MIT自动驾驶汽车之深度学习课程更新到2018版本,PPT酷炫. ------ ------ 麻省理工学院6.S094:自驾车深度学习 跳至内容 Home DeepTraffic DeepCrash ...
- 新手入坑自动驾驶,我是这么学习的......
它是谁? 没错,它就是是英伟达推出的一款入门级人工智能小车--Jetbot ,估计对机器人,尤其是对车械感兴趣的朋友们一定对它不陌生.组装完成后能够通过摄像头自主识别障碍物并避开,还可以进行人脸识别, ...
- ROS2的学习笔记(legacy)
1 基础概念 1.1 执行单元 1.1.1 executable--执行程序 executable是一个具有main函数的执行程序,它反应了针对某个目标的程序执行流程, 于是一个executable可 ...
最新文章
- ARM汇编:使用汇编语言进行数据访问时需要注意的几个问题
- SQL Server 2000 To SQL Server 2005
- unix 网络编程卷2 第43页 管道:open竟然会阻塞?
- 计算机开机显示器无显示桌面,电脑开机后显示器不亮故障排除方法
- python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?
- UC将发布高性能HTML5游戏引擎X-Canvas
- ​618购物节,我用python逛淘宝、亚马逊,摸鱼被领导发现了
- CodeForces - 946C String Transformation
- STM32外部中断具体解释
- VS连接SQL ,Windows登录SQL 语句
- 高等数学常用极限求法总结(无详解)
- 电信光猫dns服务器修改,电信光猫自动获取的DNS被修改,肿么改回来?
- 私有链和联盟链的机会与挑战
- HBase eclipse开发环境搭建
- 2022(春)软工作业2:个人编程练习
- Ubuntu安装播放器 或 Linux上比较好用强大、并且可以倍速播放的播放器SMplayer
- el-form表单添加自定义验证
- CHIL-ORACLE-循环 语法
- 怎么登录服务器上的网页,云服务器怎么在网页上登录
- 拼多多如何提高大促报名通过率?
热门文章
- 初识HTML5(一)
- 使用MSIL 汇编程序 (Ilasm.exe) 2 强签名
- 代码测试:简单用户注册信息验证
- Sql Server 2000 无法打开用户默认数据库。登录失败
- html5手机常亮,vue开发的webapp中的手机物理返回键,以及屏幕常亮处理
- 耳挂式蓝牙耳机原理_蓝牙真无线耳机MP3功能二合一 wedoking W-607耳机评测
- Count on a tree SPOJ - COT
- 牛客第三场多校 H Diff-prime Pairs
- 51-表达式计算(带括号的)
- Struts2入门到放弃