完全小白的pycharm深度学习调试+for循环断点条件设置
完全小白的pycharm深度学习调试+for循环断点条件设置
- 写在最前面
- 基础方法
- pycharm断点调试
- 控制台输入
- 代码中循环的debug方法
- pycharm中图标的介绍
- 常见的Bug
- Debug经验
- 1. 检查激活函数的输入值
- 2. 检查梯度
- 3. 消融实验
- 4. 使用最短的时间
- 5. 静下心来
写在最前面
之前把seq2seq+attention基础代码,从机器翻译迁移到文本摘要,再加上是自己的数据集,结果全显示截止符;
一方面可能是数据问题,一方面可能是我代码改错了,一方面可能是模型太基础了,一方面程序也没有报错;
所以排查起来很是头疼
一直尝试debug,但是百度不到类似的好方法,所以很是艰辛
今天很幸运的得到了实习的吕老师指点一二
特此记录,方便自己之后查询,也和大家分享一下,有好用的方法欢迎留言交流~
参考:https://zhuanlan.zhihu.com/p/62610785
https://blog.csdn.net/dong_liuqi/article/details/114980453
基础方法
断点调试,breakpoint。
在程序自动运行的过程中,程序只跑到你设置的断点位置处,则会中断下来,此时可以看到之前运行过的所有程序变量。
pycharm断点调试
点击行号后面区域,会出现一个红点,那个点就是设置的断点

下拉框选择当前.py文件后,点击小虫子图标,进入debug 模式

与正常的 run 去运行程序没很大差异
区别就是 pycharm 的控制台部分,从 run 跑到了 debug 显示。
并且可以显示所有的变量。

控制台输入
直接打印想要了解的张量or其他变量

将变量转为numpy,方便更直观的显示

命名为aa,显示在所有变量最前面(小细节太帅了)
如果是gpu跑的代码,记得加上cpu(),将数据转移到本机
aa = src.cpu().numpy()

前后区别对比


并且作为numpy变量,这个是实时变化的~
也可设置为监视对象
代码中循环的debug方法
想要i=3时停下来
方法一:新增判断语句,并对if的条件设置断点

方法二:断点右键设置条件

程序直接跳到i=3。简直完美
pycharm中图标的介绍
仅对常用的展开说明,其他的可通过鼠标悬停查看
一般操作步骤就是:
设置好断点,debug运行,
然后 F8单步调试,
遇到想进入的函数 F7 进去,
想出来在 shift + F8,
跳过不想看的地方,直接设置下一个断点,然后 F9 过去。

step over(F8快捷键):在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在不存在子函数的情况下是和step into效果一样的。简单的说就是,程序代码越过子函数,但子函数会执行,且不进入。

step into(F7快捷键):在单步执行时,遇到子函数就进入并且继续单步执行,有的会跳到源代码里面去执行。

step into my code(Alt+Shift+F7快捷键):在单步执行时,遇到子函数就进入并且继续单步执行,不会进入到源码中。

step out(Shift+F8快捷键):假如进入了一个函数体中,你看了两行代码,不想看了,跳出当前函数体内,返回到调用此函数的地方,即使用此功能即可。

可输入表达式,然后进行evaluate



Resume program(F9快捷键):继续恢复程序,直接运行到下一断点处。



常见的Bug
深度模型的Debug与一般程序的Debug有很大的不同。
一般程序的Debug通常可以通过简单地打断点调试出来,而深度模型通常会出现程序的所有模块都可以正常跑通,但就是模型效果与正常情况相去甚远,这种Debug就非常的困难.
对于大模型来说,一处"笔误"可能也会导致很大的问题。
-
某一部分参数梯度总为0
可能是程序里存在"笔误", 有一部分的参量并没有加入模型中进行运算 -
Loss不下降
(未完待续)
Debug经验
1. 检查激活函数的输入值
使用Relu系的激活函数时, 如果输入激活函数前的数值异常大, 那么可能导致之后的结果出现问题.
使用Sigmoid时, 如果输入激活函数前的数值远远超出了其激活范围(即[-1,1]), 也可能导致训练出现严重问题.
2. 检查梯度
检查梯度是否消失
检查梯度是否爆炸
具体方法:直接输出各个参数的梯度
def _print_grad(self, model):'''Print the grad of each layer'''for name, parms in model.named_parameters():print('-->name:', name, '-->grad_requirs:',parms.requires_grad, ' -->grad_value:',parms.grad)
先输出该层参数是否存在梯度, 再输出梯度值. 这个函数应该放在梯度反向传播计算之后, 即loss.backward()之后.
3. 消融实验
如果一个深度模型中有多个模块, 可以使用消融实验的方法对每个模块进行测试.
这样可以先定位出问题出在哪个模块里, 即缩小bug的范围.
如果每个模块都有问题, 那么则应该去检查数据输入以及训练部分是否存在问题.
⭐️ 我觉得这各方法非常重要, 因为他能帮助定位bug的范围. 其实debug最大的难点就在于确定bug的位置.
4. 使用最短的时间
如果问题不是训练本身的精度不够等问题, 可以适当调整batch size的大小来加快训练.
这样可以提高debug效率.
5. 静下心来
遇到bug首先要静下心来想问题可能出现的地方, 然后一步步去排查.
最好是能将问题以及排查结果进行记录, 这样可以更好地分析问题所在.
切忌还没有想好问题就一遍遍地跑训练, 其实这样做是非常浪费时间的.
在很多次尝试后, 都没能够将bug排除也是很有可能遇到的事情, 这时候会非常烦躁, 不利于问题的分析. 建议先去完成其他的任务, 在冷静下来后再继续进行debug(本人亲测有效, 有时甚至第二天一开始就干掉了bug).
相关文章:
完全小白的pycharm深度学习调试+for循环断点条件设置
完全小白的pycharm深度学习调试for循环断点条件设置写在最前面基础方法pycharm断点调试控制台输入代码中循环的debug方法pycharm中图标的介绍常见的BugDebug经验1. 检查激活函数的输入值2. 检查梯度3. 消融实验4. 使用最短的时间5. 静下心来写在最前面 之前把seq2seqattention…...
直方图及其应用
直方图定义直方图是一种描述数据的分布通过将连续变量划分成一系列区间,统计区间频率,并用来表示,以表征其统计特征在图像处理中,直方图可以用来表示图像中像素值的分布状况,描述不同灰度级的像素在图像中的占比直方图…...
《SpringBoot篇》26.SpringBoot整合Jackson超详细教程(附Jackson工具类)
陈老老老板🦸👨💻本文专栏:SpringBoot篇(主要讲一些与springboot整合相关的内容)👨💻本文简述:本文讲一下Jackson常见用法,超级详细。👨&am…...
Redis 如何实现库存扣减操作和防止被超卖?
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…...
(Linux)Ubuntu查看系统版本
uname -a : 查看操作系统的发行版号和操作系统版本 Command: uname -aResult: Linux SERVER 5.19.0-35-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 3 18:36:56 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux uname -v : 查看版本号 Command: uname -vResult: #36-Ubuntu …...
VxWorkds 内存管理(3)
虚拟内存管理 对于带MMU的目标板,VxWorks提供虚拟内存的支持,VxWorks提供了两种虚拟内存管理单元(MMU)的支持: 基本MMU和VxVMI 基本MMU邦定于VxWorks中,可以通过config.h中宏定义INCLUDE MMU BASIC或Tornado工程配置中包含基本MMU组件 VxV…...
单元测试、反射、注解、动态代理
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录单元测试、反射、注解、动态代理单元测…...
【数据结构】夯实基础|线性表刷题01
作者:努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。博主主页: 是瑶瑶子啦所属专栏: 【数据结构|刷题专栏】:该专栏专注于数据结构知识,持续更新&a…...
Java怎么实现几十万条数据插入(30万条数据插入MySQL仅需13秒)
本文主要讲述通过MyBatis、JDBC等做大数据量数据插入的案例和结果。 30万条数据插入插入数据库验证实体类、mapper和配置文件定义User实体mapper接口mapper.xml文件jdbc.propertiessqlMapConfig.xml不分批次直接梭哈循环逐条插入MyBatis实现插入30万条数据JDBC实现插入30万条数…...
java多线程之线程的六种状态
线程的六种状态(1) NEW(初始状态)(2) TERMINATED(终止状态 / 死亡状态)(3) RUNNABLE(运行时状态)(4) TIMED_WAITING(超时等待状态)(5) WAITING(等待状态)(6) BLOCK(阻塞状态)sleep和wait的区别:操作系统里的线程自身是有一个状态的,但是java Thread 是对系统线程的封装,把这里的…...
UnixBench----x86架构openEuler操作系统上进行性能测试
【原文链接】UnixBench----x86架构openEuler操作系统上进行性能测试 (1)打开github上 UnixBench 地址,找到发布的tag (2)找到tar.gz包,右键复制链接 比如这里是 https://github.com/kdlucas/byte-unix…...
于Java8 Stream教程之collect()
目录 前言正文第一个小玩法 将集合通过Stream.collect() 转换成其他集合/数组:第二个小玩法 聚合(求和、最小、最大、平均值、分组)总结前言 本身我是一个比较偏向少使用Stream的人,因为调试比较不方便。 但是, 不得不说&#…...
Python
1、str 三个关键点: 正着数,0,1,2 反着数,0,-1,-2 str[a,b] 左闭右开 [a,b) str123456789 print(str) # 输出字符串 print(str[0:-1]) # 输…...
Spring框架中IOC和DI详解
Spring框架学习一—IOC和DI 来源黑马Spring课程,觉得挺好的 目录 文章目录Spring框架学习一---IOC和DI目录学习目标第一章 Spring概述1、为什么要学习spring?2、Spring概述【了解】【1】Spring是什么【2】Spring发展历程【3】Spring优势【4】Spring体系…...
本地快速搭建Kubernetes单机版实验环境(含问题解决方案)
Kubernetes是一个容器编排系统,用于自动化应用程序部署、扩展和管理。本指南将介绍Kubernetes的基础知识,包括基本概念、安装部署和基础用法。 一、什么是Kubernetes? Kubernetes是Google开发的开源项目,是一个容器编排系统&…...
FPGA控制DDS产生1CLK周期误差的分析(二)
前文简短的介绍了DDS的产生原理,其实相当的简单,所以也不需要多做解释,本文详细阐述一下在调试DDS的过程中所产生的一个bug 问题发现 正如上文所述,再用FPGA控制存储在rom中的波形信号输出之后,在上板之前࿰…...
这一次,吃了Redis的亏,也败给了GPT
关注【离心计划】,一起离开地球表面 背景 组内有一个系统中有一个延迟任务的需求,关于延迟任务常见的做法有时间轮、延迟MQ还有Redis Zset等方案,关于时间轮,这边小苏有一个大学时候做的demo: https://github.com/JA…...
第一章 信息化知识
1、信息是客观事物状态和运动特征的一种普遍形式,信息的概念存在两个基本的层次,即本体论层次和认识论层次: 本体论层次:就是事物的运动状态和状态变化方式的自我表述认识论层次:就是主体对于该事物的运动状态以及状态…...
如何用matlab工具箱训练一个SOM神经网络
本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com本文展示如何用matlab工具箱训练一个SOM神经网络的DEMO并讲解其中的代码含义和相关使用说明- 01.SOM神经网络DEMO代码 -- 本文说明 -下面,我们先随机初始化一些样本点,然后…...
音视频技术开发周刊 | 285
每周一期,纵览音视频技术领域的干货。新闻投稿:contributelivevideostack.com。GPT-4 Office全家桶发布谷歌前脚刚宣布AI工具整合进Workspace,微软后脚就急匆匆召开了发布会,人狠话不多地祭出了办公软件王炸——Microsoft 365 Cop…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
