
深入浅出PyTorch
文章平均质量分 66
我是一个对称矩阵
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
模型剪枝及yolov5剪枝实践
2)结构化剪枝将通道全部置0了,理论上可以去掉这个通道,比如上方的(1,16,6,6)卷积核可以去掉5个0值通道后,变成(1,11,6,6)。效果如下,这是模型中第一个卷积的权重,经过剪枝后,权重矩阵中有很多都被置0了,模型的大小也降低了一半。经过结构化剪枝后,对(1,16,6,6)的卷积核,统计16个通道权重值,可以看到有16*0.3=4.8≈5个通道置0了。模型剪枝的定义就不再赘述,剪枝就是将网络结构中对性能影响不大且权重值较小的节点去掉,从而降低模型的计算量,提高运算速率。原创 2025-01-22 13:55:51 · 1789 阅读 · 0 评论 -
熵、KL散度和交叉熵
首先我们需要知道,所有的模型都可以看作是一个概率分布模型,包括人脑进行图像分类时也可以看作是一种完美的模型。原创 2023-06-22 23:48:45 · 647 阅读 · 0 评论 -
预训练中固定模型中某些层后训练,这些层还是变动了?
在深度学习中我们经常会使用到预训练进行微调,提高模型的泛化能力,加快收敛速度,节约训练时间。一般来讲,预训练多种方式,常见的有对预训练层设置更小的学习率,或者固定预训练层,不进行权重更新,这里讨论的是后一种。原创 2023-03-13 19:48:06 · 548 阅读 · 0 评论 -
记录PyTorch中半精度amp训练出现Nan的排查过程
网络的教程来看,在半精度amp训练出现nan问题,无非就是这几种:但是总结起来就三种:先说结论,我使用amp半精度训练,即中间会参杂float16数据类型,加快训练过程。但是本文出现Nan就是因为float16,因为float16支持的最大值在65504,而我的模型中涉及一个矩阵乘法(其实就是transformer中的q@k运算)。其中,a∈[-38,40],b∈[-39,40],而矩阵乘法a@b=c,c∈[-61408,inf]。因为a和b的矩阵乘法运算后最大值超过了float16最大表示,造成出现inf原创 2022-12-06 23:01:41 · 5135 阅读 · 0 评论 -
使用Pandas-csv记录训练梯度
首先我们通过named_parameters()函数来获取每层名字和梯度值,构建成字典,然后将字典转为DataFrame,通过to_csv()函数写入csv文件。实际上如果要记录其他比如每层的权重值,也可以通过该方法。原创 2022-10-01 20:01:39 · 589 阅读 · 0 评论 -
(pt可视化)利用torch的make_grid进行张量可视化
在使用pytorch时,有时候需要对张量进行可视化,比如在经过一堆数据预处理后,我们从dataloader拿到了一个张量:[8,3,224,224],显然这是一个bs=8且为RGB的张量,一般来说经过ToTensor和Normalize后值范围在[-1,1],如果想看看这些张量是什么样子,一堆代码还是挺麻烦的,所以利用torch提供的make_grid和plt就能够轻松可视化张量。原创 2022-09-25 15:31:01 · 3286 阅读 · 0 评论 -
Loss上升,精度却也上升?
在训练中遇到了下图验证集损失先降后升,这是典型的过拟合,但是此时验证集精度却仍然在上升(直觉认为Loss上升变差应当精度下降变差),这种反直觉的现象引发了思考。原创 2022-09-14 09:43:08 · 8448 阅读 · 0 评论 -
关于Pytorch中的train()和eval()(以及no_grad())
这三个函数实际上很常见,先来简单看下使用方法train()是nn.Module的方法,也就是你定义了一个网络model,那么表示将该model设置为训练模式,一般在开始新epoch训练时,我们会首先执行该命令:同train()一样,其用法和含义也一样,eval()是nn.Module的方法,也就是你定义了一个网络model,那么表示将该model设置为验证模式,一般在开始验证当前model效果时,我......原创 2022-07-04 23:32:01 · 6502 阅读 · 6 评论 -
fer2013的csv文件转换为ImageNet格式(以图片格式保存在各自类别的文件夹中)
1、fer2013数据集下载fer2013源文件fer2013.csv的下载:链接:BD网盘 提取码:nq6h2、转换代码代码文件不传CSDN资源,直接给代码# -*- encoding: utf-8 -*-"""@File : csv2img.py @Contact : [email protected]@Modify Time @Author @Version @Desciption------------ ------- --原创 2022-05-24 21:30:10 · 1528 阅读 · 0 评论 -
利用HiddenLayer和netron进行pytorch模型结构可视化
模型可视化是通过直观方式查看我们模型的结构。通常我们使用pytorch定义的网络模型都是代码堆叠,实现的和我们想象的是否一致呢,除了细致推敲代码外,直接通过图的方式展示出来更加直观。在这里介绍HiddenLayer和netron进行模型可视化,HiddenLayer是可以直接对pt模型进行可视化的,而netron无法直接可视化pt模型,所以我们通过将pt转为onnx模型,再通过netron进行可视化。原创 2022-05-12 17:34:13 · 2258 阅读 · 3 评论 -
Pytorch自定义transform数据增强
1、数据增强数据增强在缓解模型过拟合的问题上是非常给力的一种方法,虽然pytorchvision官方提供了一些数据增强,但是不一定能跟得上你具有创造性的想象力,你希望能自己定义一些数据增强的方法。事实上我们自己写一个函数对图像进行一些处理是比较简单的,但是如何融入到transforms中去,而不影响训练时数据的加载?2、transforms.Lambda这个类文档中描述为“Apply a user-defined lambda as a transform.”,帮助用户自定义作为transform,原创 2022-05-07 17:00:58 · 1272 阅读 · 0 评论 -
Pytorch使用GradScaler进行训练加速
1、Pytorch的GradScaler2、如何使用起因是一次参考一个github项目时,发现该项目训练和验证一个epoch耗时30s,而我的项目训练和验证一个epoch耗时53s,当训练多个epoch时,这个差异就很大了。通过研究发现github项目使用了GradScaler来进行加速,所以这里总结一下。1、Pytorch的GradScalerGradScaler在文章Pytorch自动混合精度(AMP)介绍与使用中有详细的介绍,也即是如果tensor全是torch.float32,计算成本会大一.原创 2022-04-28 13:33:49 · 11528 阅读 · 2 评论 -
(pt可视化)Grad-cam:原理及pytorch实现
1、原理2、代码实现1、原理首先简单提下CAM,CAM原理如下图所示,其实就是将某层的激活图按权重进行加权和。我们关注两点:1)激活图,即某层的特征图。2)权重对应每层的重要程度。实际上在我所知的各种变形CAM方法中,都是基于激活图和权重值的加权和原理,只不过不同方法获取权重值的方法不一样,grad-cam就是利用梯度来计算权重值。那么在CAM中权重值就是全连接层中对应类的weights。而grad-cam的原理和cam差不多,只不过获取权重的方法不同。grad-cam从名字可以看出,它是通过梯度.原创 2022-04-23 17:15:48 · 17301 阅读 · 3 评论 -
PIL库在深度学习中的常见操作
用惯了opencv,偶尔要用PIL但是不太熟悉,这里总结一下常用的语法 1、图片的打开和显示2、查看图像信息3、图像模式转换4、图片保存5、图像其他操作6、与其他常见格式的转换1、图片的打开和显示from PIL import Imageimport matplotlib.pyplot as plt# 打开图片im=Image.open(path)# 显示图片# 该方法调用系统图片浏览软件im.show()# 显示图片# 该方法通过库绘制图像来显示plt.figure(titl原创 2022-04-22 17:19:07 · 3449 阅读 · 0 评论 -
Pytorch中如何获取某层Module?(方便改变梯度,获取特征图,CAM等)
1、引入2、方法2.1、方法一:从结构上获取层2.2、方式二:通过名字直接获取1、引入我们有时候需要改变某层梯度,或者获取某层梯度图,甚至画CAM可视化效果时,需要定位到模型中某层,但往往模型中层的结构层层嵌套,难。2、方法我们以torchvision.models中resnet34为例,来获取其中名"layer1.1.conv2"的层,以下是resnet34结构部分截图:首先我们先看看所有层的名字:for n,v in net.named_parameters(): print(n).原创 2022-04-21 15:52:47 · 4849 阅读 · 1 评论 -
PyTorch常用代码段
[深度学习框架]PyTorch常用代码段文中有很多其他的trips,这里记录一下我需要的1、导入包和版本查询导入包和版本查询torch版本CUDA版本cuDNN版本CUDA设备名字2、可复现性可复现性设定numpy随机种子设定torch随机种子固定算法 pytorch—之cudnn.benchmark和cudnn.deterministic3、显卡设置显卡设置单卡多卡清除显存4、将在 GPU 保存的模型加载到 CPU将在 GPU 保存的模型加载到 CPU原创 2022-04-14 19:05:31 · 1114 阅读 · 0 评论 -
热力图的关键:利用register_hook获取梯度
1、使用方法完整文章见PyTorch中Hook的简单使用def hook_fn(grad): grad *= 2 return gradz.register_hook(hook_fn) # 注册一个钩子z.backward() # 计算z的梯度上面的代码展示了如何获取或者修改z的梯度:首先需要注册一个钩子,当代码运行到涉及z的梯度(比如backward)时,会想起这里的钩子,并执行传入的函数hook_fn,其参数grad就是z的梯度,你可以将这个梯度保存下来,也可以如代码中原创 2022-03-05 21:19:36 · 2031 阅读 · 0 评论 -
残差网络(Pytorch实现)
0. 前言本文讲如何使用Pytorch实现残差网络,残差网络的结构如图:输入x,输出output=F(x)+x:F(x)为输入经过卷积运算后的结果,x为输入本身。实际上就是将输出结果再次加上了本身。1. 如何理解"+"号运算?这里的加法实际上就是对应位的数值相加,比如[1,2,3]和[4,5,6]相加的结果为[5,7,9],并不是通道的拼接,如此便要求x和F(x)应当拥有相同的shape。我们通过实验来看加号(F(x)具体运算省略):定义输入x:F(x)为:x+F(x)的结果为:2.原创 2021-09-10 18:54:50 · 4233 阅读 · 7 评论 -
2.7.2基于模块类的简单线性回归类
0.前言简单线性网络其实就是全连接网络,比如一个输入形状为(5,),输出形状为(2,)的线性网络结构:1.代码构建网络使用pytorch实现这样一个线性网络,代码如下:import torchfrom torch import nnclass LinearModel(nn.Module): def __init__(self,input_features,out_features): super(LinearModel,self).__init__()原创 2021-08-29 16:30:59 · 327 阅读 · 0 评论