
Pytorch那些事儿
文章平均质量分 56
木盏
坐标 北京
喜欢写博客的CV工程师
levio@pku.edu.cn
展开
-
【pytorch扩展】CUDA自定义pytorch算子(简单demo入手)
Pytorch作为一款优秀的AI开发平台,提供了完备的自定义算子的规范。我们用torch开发时,经常会因为现有算子的不足限制我们idea的迸发。众所周知,CUDA/C++都是编译性语言,编译以后再调用会比python这种解释性语言更快。所以,我们需要对CUDA有一个编译过程。直接“python setup.py install”即可完成cuda算子的编译和安装。这里的"sum_double_op"就是我们用CUDA写的算子。那这个可以直接调用,并且可以传递梯度的算子,需要怎么做呢?原创 2024-07-04 22:50:27 · 918 阅读 · 0 评论 -
pytorch中的contiguous()
我们随便初始化的张量一开始都是连续张量,后来在计算中为了加速和节省存储,我们只会操作张量的索引,比如常见的narrow(), view(), expand() 和 transpose()等。这样就会产生在内存上不连续,或者索引值顺序乱序的情况。由这个例子,我们可以看出,二维张量转置以后会变得不连续,我们用contiguous做连续化以后并不会覆盖原来的张量,而是重新开辟了一块地址来存储连续的新张量。所以,contiguous只是在存储上做调整,不会改变张量的值。将张量在内存上调整为连续。原创 2024-07-04 22:28:36 · 602 阅读 · 0 评论 -
【张量乘法】pytorch中的mul、dot、mm、matmul
张量的乘法是pytorch等神经网络开发框架中最常见、最基本的操作之一。原创 2024-05-27 10:11:10 · 921 阅读 · 2 评论 -
PSNR/SSIM/LPIPS图像质量评估三件套(含代码)
PSNR,峰值信噪比,是基于MSE的像素比较低质量评估,一般30dB以上质量就不错,到40dB以上肉眼就很难分别了。在图像质量评估上,有三个重要指标:PSNR,SSIM,LPIPS。LPIPS,利用AI模型来量化图像之间的相似性。取值范围也是[0,1],与SSIM相反,像这种常见的图像质量评价指标,都会收录到torchmetrics里面。SSIM,结构相似性,从分布上来比较相似性,量化到(0-1)之间,代码里给了两种PSNR实现方法,计算结果差别不大。LPIPS是越小则证明图像质量越好。原创 2024-03-21 15:16:20 · 2854 阅读 · 0 评论 -
pytorch中的可学习查找表实现之nn.Embedding
假设我们需要一个查找表(Lookup Table),我们可以根据索引数字快速定位查找表中某个具体位置并读取出来。最简单的方法,可以通过一个二维数组或者二维list来实现。但如果我希望查找表的值可以通过梯度反向传播来修改,那么就需要用到。其实,我们需要用反向传播来修正表值的场景还是很多的,比如我们想存储数据的通用特征时,这个通用特征就可以用nn.Embedding来表示,常见于现在的各种codebook的trick。,请注意这个shape变化,即对应位置的索引获得对应位置的表值。原创 2024-02-29 17:18:34 · 787 阅读 · 0 评论 -
pytorch保存张量为图片
的意思,我们有64张3通道的图片需要可视化。那么,我设定每排放8张。这里用到的是torchvision中的save_image。首先,这里我们要明确。原创 2024-02-22 17:52:03 · 1257 阅读 · 0 评论 -
torch.norm求范数
pytorch在数学计算上下足了功夫,在支持海量数学公式的同时还将速度优化到超过大部分用户DIY的水平。所以,pytorch中的每个常见的数学计算函数都需要我们有一定了解。今天介绍的是torch.norm,一个pytorch用来求范数的函数。我们先看求范数的数学公式:原创 2023-11-13 22:21:58 · 612 阅读 · 0 评论 -
torch.cumprod实现累乘计算
cumprod取自“cumulative product”的缩写,即“累计乘法”。数学公式为:原创 2023-11-05 18:09:31 · 1155 阅读 · 0 评论 -
Pytorch张量升维
pytorch使用过程中,经常需要对张量进行维度校准。我们简单把一个2x2的tensor升维到1x2x2,该怎么做呢?原创 2023-07-04 17:34:22 · 1465 阅读 · 0 评论 -
Pytorch实现多GPU并行训练(DDP)
Pytorch实现并行训练通常有两个接口:DP(DataParallel)和DDP(DistributedDataParallel)。目前DP(DataParallel)已经被Pytorch官方deprecate掉了,原因有二:1,DP(DataParallel)只支持单机多卡,无法支持多机多卡;2,DP(DataParallel)即便在单机多卡模式下效率也不及DDP(DistributedDataParallel)。原创 2023-06-29 15:30:30 · 5540 阅读 · 9 评论 -
GradCAM神经网络可视化解释(原理和实现)
GradCAM是经典的特征图可视化工具,在CV任务中,能用于分析CNN学到了什么东西。先看一张图:这就是GradCAM做出的效果,它直观地表示出咱们模型认为图片是Dog的是依据哪些地方。GradCAM借用梯度来进行注意力表示,发表于ICCV2017,如今依然活跃在学术和工程界。GradCAM原理对于视觉任务,包括图像分类、目标检测等,通常都是backbone+head的形式。如图1所示。所以,GradCAM可以无差别地对各种视觉任务进行可视化。在操作上,GradCAM拿到backbone的输原创 2022-05-07 18:29:09 · 9728 阅读 · 5 评论 -
Pytorch中的register_hook(梯度操作)
对于高阶调参师而言,对神经网络梯度级别的操作的不可避免的。有时候,咱们需要把某一层的梯度拿出来分析,辅助特征图可视化(如GradCAM);再比如,hook还可以做优化器设计的实验。hook,在中文里就是“钩子”的意思。Pytorch默认在反向传播过程中,不保留中间层的梯度,以达到减少内存的目的。如果需要对某一层的梯度特别感兴趣,咱们可以用钩子把它勾住,再等反向传播的时候,就可以访问到这一层的梯度。甚至可以对这层梯度进行修改,进而影响浅层的梯度传播。我们先看官方给出的示例:import torchv原创 2022-05-07 15:14:05 · 6213 阅读 · 0 评论 -
Pytorch加载指定层的参数
Pytorch加载模型的时候,有时候并不需要加载全部的模型参数。比如,做迁移学习的时候,我们将模型A的参数迁移到模型B上,这两个模型整体结构是不一样的,只是有些layer的是一样的,直接用model_b来load模型A的参数肯定会报错。我们只是想把模型A的部分参数加载到模型B上。原创 2022-04-06 11:00:44 · 3755 阅读 · 0 评论 -
Pytorch保存和加载模型(load和load_state_dict)
Pytorch目前成为学术界最流行的DL框架,没有之一。很大程度上,简洁直观地操作有关。模型的保存和加载,于pytorch而言,也是很简单的。本文做了一个比较实验,方便大家理解。首先,要清楚几个函数:torch.save,torch.load,state_dict(),load_state_dict()。先举最简单的例子:import torchmodel = torch.load('my_model.pth')torch.save(model, 'new_model.pth')上面的代码非原创 2022-04-02 18:20:49 · 68546 阅读 · 6 评论 -
torch.backends.cudnn.benchmark的用法
首先,要明白backends是什么,Pytorch的backends是其调用的底层库。torch的backends都有:cudacudnnmklmkldnnopenmp代码torch.backends.cudnn.benchmark主要针对Pytorch的cudnn底层库进行设置,输入为布尔值True或者False:设置为True,会使得cuDNN来衡量自己库里面的多个卷积算法的速度,然后选择其中最快的那个卷积算法。我们看官方文档描述:所以,当这个参数设置为True时,启动算法的前原创 2021-12-01 18:07:09 · 9838 阅读 · 0 评论 -
torch.clamp详解(限制张量取值范围)
函数形式:torch.clamp(input_tensor, min_value, max_value)举个栗子:torch.clamp(a, 0, 255)如果a是一张图像数据张量,那么咱们可以限制其取值范围在[0, 255]之间。当a中有元素低于0,则该元素被置为0;当a中有元素超过255,则该元素取值被置为255;...原创 2021-10-25 18:04:33 · 3272 阅读 · 0 评论 -
torch.roll图片实验
torch.roll顾名思义,就是**让张量滚动**的意思。官方文档:https://pytorch.org/docs/master/generated/torch.roll.html原创 2021-10-18 11:18:49 · 728 阅读 · 0 评论 -
pytorch中nn.Dropout的使用技巧
dropout是Hinton老爷子提出来的一个用于训练的trick。在pytorch中,除了原始的用法以外,还有数据增强的用法(后文提到)。原创 2021-10-15 17:20:14 · 31678 阅读 · 2 评论 -
einops张量操作神器(支持PyTorch)
今天做visual transformer研究的时候,发现了einops这么个神兵利器,决定大肆安利一波。先看链接:https://github.com/arogozhnikov/einops安装:pip install einops基础用法einops的强项是把张量的维度操作具象化,让开发者“想出即写出”。举个例子:from einops import rearrange# rearrange elements according to the patternoutput原创 2021-04-27 17:19:04 · 29661 阅读 · 6 评论 -
Pytorch指定GPU去运行
在开头加入这么2句就可以了:import osos.environ["CUDA_VISIBLE_DEVICES"] = "2" # 0, 1, 2, ...指定设备id就行了,需要注意的是"2"需要加引号。原创 2021-03-09 21:22:30 · 800 阅读 · 0 评论 -
从Pytorch模型pth文件中读取参数成numpy矩阵
目的:把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备。Pytorch给了很方便的读取参数接口:nn.Module.parameters()直接看demo:from torchvision.models.alexnet import alexnetmodel = alexnet(pretrained=True).eval().cuda()parameters = model.parameters()for p in parameters: numpy_para原创 2021-01-24 03:43:22 · 4720 阅读 · 5 评论 -
【torchsummary】Pytorch模型参数统计工具
今天介绍的工具是torchsummary,可以用来统计PyTorch每层的参数情况。一来可以用于参数剪枝优化,二来可以用于了解模型的参数分布。安装:pip install torchsummary使用:from torchvision.models.alexnet import alexnetfrom torchsummary import summarymodel = alexnet(pretrained=True).eval().cuda()summary(model, i原创 2021-01-24 03:07:32 · 3758 阅读 · 1 评论 -
使用TensorRT加速Pytorch模型(简单实用)
TensorRT是Nvidia官方给的推理加速工具,如同OpenVINO之于Intel。支持诸多的AI框架,如Pytorch,caffe,MXnet,tensorflow等。此外还对某些热门框架有特别的照顾,比如针对PyTorch有直接转换的工具torch2trt(咱们一会儿说)。原创 2021-01-21 17:06:04 · 17909 阅读 · 22 评论 -
Pytorch模型转成onnx并验证结果(排坑经验帖)
很多时候有pytorch模型转onnx模型的必要,比如用tensorRT加速的时候。本文将介绍pytorch的pth模型如何转换成onnx,并且验证你转的模型对不对。先给官网链接:https://pytorch.org/docs/stable/onnx.html咱们直接用一段代码来看:(本人亲自整理,有问题可留言交流~)import os.path as ospimport numpy as npimport onnximport onnxruntime as ortimport t原创 2021-01-14 22:38:43 · 13345 阅读 · 9 评论 -
【半精度】Pytorch模型加速和减少显存
如标题所示,这是PyTorch框架提供的一个方便好用的trick:开启半精度。直接可以加快运行速度、减少GPU占用,并且只有不明显的accuracy损失。原创 2021-01-11 16:04:08 · 33817 阅读 · 11 评论 -
pytorch多卡训练(含demo)
用pytorch进行多GPU训练,只需要学会把单卡训练的代码稍微改一下即可。不用弄得太麻烦。通过一个demo来做是最快入手的。1. 要知道机器有几张卡:nvidia-smi2. 模型用DataParallel包装一下:device_ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 10卡机model = torch.nn.DataParallel(model, device_ids=device_ids) # 指定要用到的设备model = model..原创 2020-10-27 19:20:12 · 42211 阅读 · 17 评论 -
pytorch中tensor与其他数据结构的转化(int, list, array)
本文记录cpu张量、cuda张量、list和array之间的转换关系。import torchimport numpy as np# list -> tensor(cpu)l0 = [1, 2, 3]t = torch.Tensor(l0)# tensor(cpu) -> numpy -> lista = t.numpy()l1 = t.numpy().tolist()# list -> numpya0 = np.array(l0)# numpy -.原创 2020-10-27 19:39:26 · 18661 阅读 · 1 评论 -
Pytorch使用TensorBoard做可视化
TensorBoard是一款优秀的基于浏览器的机器学习可视化工具。之前是tensorflow的御用可视化工具,由于tensorboard是并不是读取tf张量,而是读取log进行可视化。所以,其他框架只需生成tensorboard可读的log,即可完成可视化。之前,我一直用visdom做pytorch可视化,也是非常易用。不过现在跟tensorboard对比,我还是更推荐tensorboard。visdom相比tensorboard只有一个优点,那就是自动实时刷新。而tensorboard无论从可视化原创 2020-10-09 20:42:48 · 9881 阅读 · 1 评论 -
pytorch中的维度调换permute()函数
第一步,给出官方文档中关于permute的解释:https://pytorch.org/docs/stable/tensors.html?highlight=permute#torch.Tensor.permute第二步,我用白话解释一下官方文档。permute的中文意思是,“排列组合”。permute()可以对某个张量的任意维度进行调换。我们看一个demo:import torcha = torch.randn(2,3,5)b = a.permute(1,2,0)print(b原创 2020-09-23 14:28:34 · 11986 阅读 · 0 评论 -
pytorch中的gather()函数
首先,给出官方文档的链接:https://pytorch.org/docs/stable/generated/torch.gather.html?highlight=gather#torch.gather然后,我用白话翻译一下官方文档。gather,顾名思义,聚集、集合。有点像军训的时候,排队一样,把队伍按照教官想要的顺序进行排列。还有一个更恰当的比喻:gather的作用是根据索引查找,然后讲查找结果以张量矩阵的形式返回。1. 拿到一个张量:import torcha = tor原创 2020-09-22 17:19:58 · 17969 阅读 · 11 评论 -
pytorch获取模型的中间层输出结果
在inference阶段,整个模型会load到GPU上,进行端到端的计算,通常只会给你输出一个最终结果。如果想要获取模型的中间层输出,则需要在计算前标定目标层位置(通过forward返回),或者把模型在那层截断(当作一个小模型)输出。本文介绍2种获取模型中间层输出结果的方法:1. 标定目标层位置def forward(self, x): layer1_out = self.layer1(x) layer2_out = self.layer2(layer1_out) ou原创 2020-09-08 18:36:25 · 20334 阅读 · 10 评论 -
pytorch获取张量元素个数numel()的用法
numel就是"number of elements"的简写。numel()可以直接返回int类型的元素个数import torcha = torch.randn(1, 2, 3, 4)b = a.numel()print(type(b)) # intprint(b) # 24通过numel()函数,我们可以迅速查看一个张量到底又多少元素。...原创 2020-09-08 16:43:22 · 16266 阅读 · 0 评论 -
pytorch中view的用法(重构张量)
view在pytorch中是用来改变张量的shape的,简单又好用。pytorch中view的用法通常是直接在张量名后用.view调用,然后放入自己想要的shape。如tensor_name.view(shape)Example:1. 直接用法:>>> x = torch.randn(4, 4)>>> x.size()torch.Size([4, 4])>>> y = x.view(16)>>>...原创 2020-09-08 16:11:38 · 4215 阅读 · 0 评论 -
【pytorch】RuntimeError: Integer division of tensors using div or / is no longer supported【解决】
ok, 能搜到这篇文章大概遇到了我已经遇到过的问题。今天把pytorch升级到1.6.0,发现tensor和int之间的除法不能直接用'/'。明明1.5.0都是可以用的-_-。火炬这种邻代兼容性有点值得吐槽。对于这个问题直接看官方文档就可以了:https://pytorch.org/docs/stable/generated/torch.div.html或者,看我的解决方案:对于tensor A和整数n之间的除法:result = A / n # not supported in to原创 2020-08-26 18:22:05 · 12225 阅读 · 0 评论 -
Pytorch中的dataset类——创建适应任意模型的数据集接口
作为一个2年多的不资深keraser和tfer,被boss要求全员换成pytorch。不得不说,pytorch还是真香的。之前用keras,总会发现多GPU使用的情况下不太好,对计算资源的利用率不太高。把模型改成pytorch以后,发现资源利用率非常可观。非常看好pytorch的前途,到时候能制衡一下tf就好了。闲话不多扯,我来讲讲初入pytorch最重要的东西:dataset网上有很多介...原创 2019-08-21 15:18:29 · 29985 阅读 · 61 评论