ICANN备稿时debug遇到的问题

包问题

  1. 装包:先用fastai
  2. 出现单击没有跳转的情况:安装pylance即可
  3. 出现了用pip3 uninstallpip3 list还有原来的numpy,然后用conda uninstall之后就行了。pip, pip3, conda这几个来回用。
    精度问题
    打印tensor数组自动保留后四位:
    是精度缩减了吗?其实是因为print访问的为_str_方法打印出来的小数只有四位,用torch.set_printoptions(precision=15)(设置小数精度显示)即可显示原来数据。
    visio图片转PDF
    overleaf插入去白边的Visio图:
    https://www.cnblogs.com/doubleyue/p/15684697.html
    如果使用visio,在保存为PDF图片时候点下选项,把打钩的都不选就好了

保存latest和best model函数

def main(if valid_loss < best_loss:is_best = Truebest_epoch = epochbest_prec = min(valid_loss,best_loss)save_checkpoint({'epoch': epoch + 1,'state_dict': model.state_dict(),'best_prec': best_prec,'optimizer': optimizer.state_dict(),}, is_best, fdir)def save_checkpoint(state, is_best, fdir):filepath = os.path.join(fdir, 'checkpoint.pth')torch.save(state, filepath) # latestif is_best: # bestshutil.copyfile(filepath, os.path.join(fdir, 'model_best.pth.tar'))

extra_repr
extra_repr 是 Python 中一种特殊的方法。在 PyTorch 中,它通常用于自定义类的字符串表示形式,特别是在打印对象时。当你使用 print 函数打印一个对象时,Python 会调用该对象的 str 方法来生成可读的字符串表示形式。但是,有时 str 方法可能不够详细或不够清晰,这时可以定义 extra_repr 方法来提供额外的信息。当你使用 print 函数打印对象时,Python 会检查是否定义了 extra_repr 方法,如果定义了,则会使用该方法返回的字符串来丰富对象的字符串表示形式。
return -> str一定要return的是string
例子:

class QuantReLU(nn.ReLU):def __init__(self, inplace: bool = False):super(QuantReLU, self).__init__(inplace)def extra_repr(self) -> str:return 'clipping threshold activation alpha: {:.3f}'.format(self.act_alpha)

当你print(QuantReLU)或者print的model里面含有他时,会输出:

Dummy(
(block): Sequential(
(0): Conv1d(12, 16, kernel_size=(5,), stride=(3,))
(1): QuantReLU(clipping threshold activation alpha: 7.832)
)
)

关于torch.size():
1.相加操作要掌握

import torchsize1 = torch.Size([3, 4])
size2 = torch.Size([5, 6, 7])# 将 size1 和 size2 进行相加操作
result_size = size1 + size2print(result_size)  # 输出: torch.Size([3, 4, 5, 6, 7])

2..shape返回的是torch.size()类型。
综合上述两点就可以写出以下代码:

spike_train = torch.zeros(membrane.shape[:1] + torch.Size([self.T]) + membrane.shape[1:],device=membrane.device)

state_dict
model.state_dict() 返回的是模型的参数字典,其中键是参数的名称,值是参数的张量
state_dict.pop(k) 是 Python 字典(dictionary)的一个方法,用于移除字典中键为 k 的项,并返回该项的值。

for key in checkpoint:print(key, checkpoint[key].shape)
for key in model.state_dict():print(key, model.state_dict()[key].size() or .shape)# 在 PyTorch 中,.size() 和 .shape 是等价的,两者都可以用于获取张量的形状信息。#conv1.weight 	 torch.Size([6, 3, 5, 5])
#conv1.bias 	 torch.Size([6])

原来是用的relu.thresh
要改成relu.up

keys = list(checkpoint.keys())
for key in keys:if 'thresh' in key:checkpoint[key[:-6] + 'up'] = checkpoint.pop(key)

state_dict.pop(k) 是 Python 字典(dictionary)的一个方法,用于移除字典中键为 k 的项,并返回该项的值。
由于在 Python 中字典的迭代器在遍历时不允许修改字典的结构,所以必须用keys来作为迭代。
例子二:

#Remove DataParallel wrapper 'module' 
for name in list(checkpoint['state_dict'].keys()):checkpoint['state_dict'][name[7:]] = checkpoint['state_dict'].pop(name)

torch.optim模块中的Optimizer优化器对象也存在一个state_dict对象,此处的state_dict字典对象包含state和param_groups的字典对象

for var_name in optimizer.state_dict():print(var_name,'\t',optimizer.state_dict()[var_name])
输出:
state 	 {}
param_groups 	 [{'lr': 0.001, 'momentum': 0.9, 'dampening': 0, 'weight_decay': 0, 'nesterov': False, 'params': [367949288, 367949432, 376459056, 381121808, 381121952, 381122024, 381121880, 381122168, 381122096, 381122312]}]    

网络,对不同网络层的操作
虽然表面上是说对网络以及网络层的操作,但本质上是对象和索引对象属性的问题。
有一些内置函数用来索引到对象属性:
内置函数: getattr(), setattr()

value = getattr(obj, 'attr') 
setattr(obj, 'attr', 42)

e.g.: 用于遍历索引到对象属性。

    for i in range(2, num_layers + 1):getattr(model, 'layer' + str(i)).idem = Truegetattr(snn, 'layer' + str(i)).idem = True

当没有sequential时:
print(net.fc2)
有sequential时:
print(net.fc[2])

梯度
torch.clamp是有梯度的,只有round函数需要单独考虑梯度(即写backward function)
在这里插入图片描述
round的梯度是和clip一样的。他俩都是treats the quantization and de-quantization function as if it were identity function in the clipping range and constant function outside the clipping range.

grad只要不低到0都是可以的,1e-4,1e-5,也会更新。lr * grad
alpha_new = alpha_old - learning_rate * grad_alpha

Bug
因为不懂optimizer原理犯的错误:
optimizer一定要在model settled 好之后再调用,因为有model.parameters()作为参数
这下对整个梯度的从开始到更新一轮应该比较了解了:

final_model #需要梯度的用parameter或tensor(require_grad)
optimizer = optim.Adam(final_model.parameters(), lr=0.0001)
model.train()
optimizer.zero_grad() #把optimizer存的grad清空
loss.backward() # 根据模型输出的损失值计算梯度。它会自动地沿着网络的参数计算梯度,并将梯度存储在参数的.grad属性中
nn.utils.clip_grad_norm_(model.parameters(), max_norm=10) # 会计算所有参数的梯度的范数,并根据指定的max_norm进行裁剪
optimizer.step() # 这一步是利用优化器来更新模型的参数。优化器根据梯度和指定的优化算法(如SGD、Adam等)来更新模型参数。它会使用loss.backward()计算得到的梯度来更新模型参数,通常使用学习率和其他超参数来控制更新的步长和方向。

优化器在训练过程中会存储并使用梯度来更新模型参数。每次调用optimizer.step()时,优化器会使用之前存储的梯度信息来更新模型参数。

0-d tensor 就是 scalar,不能输出他的shape

UserWarning: Detected call of lr_scheduler.step() before optimizer.step().

#scheduler.step() 不要放在这
train_acc, trian_loss= train_one_epoch(args, model, dset, optimizer, data_loader, epoch)
scheduler.step()

Loss
分类问题就无脑CE,比MSE要好。
nn.CrossEntropyLoss()=nn.LogSoftmax()+nn.NLLLoss().

optimizer
要手动将load下来的参数放到GPU上。

optimizer.load_state_dict(checkpoint['optimizer'])
for state in optimizer.state.values():for k, v in state.items():if isinstance(v, torch.Tensor):state[k] = v.cuda()

许愿第一次论文

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

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

相关文章

threejs案例,与静态三角形网格的基本碰撞, 鼠标环顾四周并投球游戏

创建一个时钟对象: const clock new THREE.Clock();这行代码创建了一个新的THREE.Clock对象&#xff0c;它用于跟踪经过的时间。这在动画和物理模拟中很有用。 2. 创建场景: const scene new THREE.Scene();这行代码创建了一个新的3D场景。所有的物体&#xff08;如模型、灯…

git问题列表(一)(持续更新中~~~)

文章目录 问题1&#xff1a;如何在本地创建git仓库&#xff0c;并推送到远程仓库&#xff1f;问题2&#xff1a;如何创建本地分支&#xff0c;并基于其创建远程分支&#xff1f;问题3&#xff1a;报错“origin does not appear to be a git repository”是什么原因&#xff1f;…

如何在Ubuntu中查看编辑lvgl的demo和examples?

如何在Ubuntu中查看编辑lvgl的demo和examples&#xff1f; 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库&#xff0c;找到lv_port_pc_eclipse这个仓库&#xff0c;点进去 拉取仓库代码和子仓库代码 仓库网址&#xff1a;https://github…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出&#xff0c;输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息&#xff0c;带有数据类型和数…

矩阵中移动的最大次数

文章目录 所属专栏:BFS算法 题目链接 思路如下&#xff1a; 1.首先我们需要从第一列开始遍历&#xff0c;寻找每一个都能够满足条件的位置&#xff0c;将它插入到数组里面 2.第一列遍历完了后我们先判断第一列的数是否都满足条件插入到数组里面&#xff0c;如果数组为空&#…

智障版本GPT3实现

背景,实现GPT3,采用python代码。调库hf及tf2.0+基础。 由于完全实现GPT模型及其预训练过程涉及大量的代码和计算资源,以下是一个基于TensorFlow 2.x的简化版GPT模型构建和调用的示例。请注意,这仅展示了模型的基本结构,实际运行需替换为真实数据集和预处理步骤,且无法直…

深入理解Transformer架构:从Seq2Seq到无监督预训练的演进

Transformer问答-2 根据我的了解&#xff0c;最开始Transformer的架构为encoderdecoder&#xff0c;是用于处理Seq2Seq任务的&#xff0c;后来GPT系列只采用decoder-only架构专注于next toke prediction任务&#xff0c;在我的认识当中&#xff0c;这两者都可以归为next toke …

基于粒子群算法的分布式电源配电网重构优化matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1基本PSO算法原理 4.2配电网重构的目标函数 5.完整工程文件 1.课题概述 基于粒子群算法的分布式电源配电网重构优化。通过Matlab仿真&#xff0c;对比优化前后 1.节点的电压值 2.线路的损耗,这里计…

18双体系Java学习之数组赋值和拷贝

数组赋值 数组拷贝 ★小贴士 Object src指定源数组&#xff0c; int srcPos指定复制开始的位置&#xff0c; Object dest指目标数组&#xff0c; int destPos指定复制的内容从哪个位置开始放置&#xff0c; int length 指复制的长度&#xff0c; 也就是说源数组中位置从 s…

ubuntu18.04安装ffmpeg

编译ffmpeg命令如下&#xff1a; 1.安装yasm wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz tar xvzf yasm-1.3.0.tar.gz cd yasm-1.3.0 ./configure make && make install2.安装nasm(2.13以上版本) wget https://www.nasm.us/pub/nasm/re…

如何解决Hexo个人博客上传GitHub后无法更新问题

HexoGitHub提供了一个轻量级、易于管理的平台&#xff0c;让大家可以轻松建立并维护自己的博客。然而&#xff0c;许多初次使用Hexo的朋友可能会遇到一个常见问题&#xff1a;在将博客上传到GitHub之后&#xff0c;对博客进行更新&#xff0c;但是网页上的内容却没有改变。本文…

linux环境下连接db2数据库的操作

linux环境下连接db2数据库的操作 1 查看db2连接相关信息2 建立连接3 取消连接4 测试连接 1 查看db2连接相关信息 su - db2inst1 ~]$ db2 list db directory ~]$ db2 list node directory ~]$ db2 list dcs directory2 建立连接 su - db2inst1 ~]$ db2 terminate ~]$ db2 cata…

数据结构大合集02——线性表的相关函数运算算法

函数运算算法合集02 顺序表的结构体顺序表的基本运算的实现1. 建立顺序表2. 顺序表的基本运算2.1 初始化线性表2. 2 销毁顺序表2.3 判断顺序表是否为空表2.4 求顺序表的长度2.5 输出顺序表2.6 按序号求顺序表中的元素2.7 按元素值查找2.8 插入数据元素2.9 删除数据元素 单链表的…

如何使用人工智能打造超用户预期的个性化购物体验

回看我的营销职业生涯&#xff0c;我见证了数字时代如何重塑客户期望。从一刀切的方法过渡到创造高度个性化的购物体验已成为企业的关键。在这个客户期望不断变化的新时代&#xff0c;创造个性化的购物体验不再是奢侈品&#xff0c;而是企业的必需品。人工智能 &#xff08;AI&…

插件电阻的工作原理,结构特点,工艺流程,选型参数及设计注意事项总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,引脚设计3.2,电阻体3.3,封装4,工艺流程4.1,材料准备4.2,电阻体制作4.3,引脚焊接4.4,绝缘处理4.5,测试与筛选4.6,包装与存储

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…

[数据集][目标检测]焊接件表面缺陷检测数据集VOC+YOLO格式2292张10类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2292 标注数量(xml文件个数)&#xff1a;2292 标注数量(txt文件个数)&#xff1a;2292 标注…

阿里云下载安装centos

这里以centos7.x版本下载安装为例 : 网址 : 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 点击centos : 再点击下载地址 : 找到 7/ 并点击 : 找到isos/并点击 : 点击x86_64 : 找到4.4G的文件点击下载 ; 点击创建新的虚拟机 , 然后选择典型 &#xff0c; 然后点击下一…

栈和队列(Java实现)

栈和队列&#xff08;Java实现&#xff09; 栈 栈(Stack)&#xff1a;栈是先进后出&#xff08;FILO, First In Last Out&#xff09;的数据结构。Java中实现栈有以下两种方式&#xff1a; stack类LinkedList实现&#xff08;继承了Deque接口&#xff09; &#xff08;1&am…

Docker入门一(Docker介绍、Docker整体结构、Docker安装、镜像、容器、Docker的容器与镜像)

文章目录 一、Docker介绍1.什么是虚拟化2.虚拟化模块3.docker是什么4.docker平台介绍5.为什么使用docker6.docker主要解决的问题 二、docker整体结构1.Docker引擎介绍&#xff08;Docker Engine&#xff09;2.Docker结构概览介绍3.Docker底层技术 三、docker安装1.Docker-CE和D…