Pytorch
撒旦即可
研究CV的菜狗
展开
-
将nn.Module作为参数传入另一个Module中,是否能优化?
将nn.Module作为参数传入另一个Module中,是否能优化?原创 2023-01-18 23:42:03 · 1271 阅读 · 1 评论 -
nn.Module是否要通过forward才能进行反向传播?
nn.Module是否要通过forward才能进行反向传播?原创 2023-01-05 17:47:54 · 351 阅读 · 0 评论 -
F.interpolate插值大小设定
1原创 2022-07-12 13:19:42 · 1520 阅读 · 0 评论 -
nn.Pixelshuffle的转化规则
简单来说,例如nn.Pixelshuffle(2),他会将前4个通道,拼在第一个通道的空间中,然后将接下来4个通道拼在输出的第二个通道的空间中,依次类推,见下面的实验就懂了实验代码import torchimport torch.nn as nnps = nn.PixelShuffle(2)c=8h=4w=4input = torch.range(1,c*h*w).view(1,c,h,w)print(input.shape)output = ps(input)print("ou原创 2022-04-03 18:41:33 · 3181 阅读 · 0 评论 -
pytorch的model.named_modules()解析
import torchimport torch.nn as nnclass Net(nn.Module): def __init__(self, num_class=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(in_channels=3, out_channels=6, kernel_size=3), nn.Batch...原创 2022-03-29 23:35:05 · 2269 阅读 · 0 评论 -
torch.masked_select和torch.masked_scatter
torch.masked_selectimport torchx = torch.randn(3,4)print(x)mask = torch.randn(3,1) >0print(mask)s=torch.masked_select(x,mask)print(s)输出tensor([[-2.7601, -0.9957, -0.2239, -1.2674], [ 1.2190, 1.6782, -0.3635, 0.6803], [-1....原创 2022-01-26 02:09:06 · 3284 阅读 · 1 评论 -
服务器间传输文件的指令
之前都是把数据集下载下来,然后再上传到另外一台服务器上,这样效率就很低可以直接使用以下指令进行传输:scp -r xxxx(填写这个文件夹的路径) xxxx(另一台服务器上的用户名)@xxxxxxx(另一台服务器的IP地址)...原创 2021-12-21 20:05:01 · 1781 阅读 · 0 评论 -
torch eval梯度回传问题
直接上结论,即使model.eval()了,梯度传还是有效的。也就是说eval也就固定batchnorm的参数用的。from torch.autograd import Variableimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch import optimfrom collections import OrderedDictclass g(nn.Module): def _..原创 2021-12-21 20:00:45 · 1275 阅读 · 0 评论 -
pytorch中parameter的默认命名规则
一般都是self.xxx作为命名,如果是conv2d,linear这些基本运算单元,那一半会有参数weight和bias.如果是nn.Squential,则是xxx.1.weight,xxx2.weight这样命名。如果是直接调用另外一个模块,那么就是xxx.xxx2......from torch.autograd import Variableimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch原创 2021-10-16 19:41:58 · 788 阅读 · 0 评论 -
pytorch模拟tensorflow的weights输入(适用元学习)
元学习中由于需要二次求导,因此使用tensorflow的形式实现是最方便的from torch.autograd import Variableimport torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch import optimfrom collections import OrderedDictfrom model_meta import commonclass g(nn.Module):原创 2021-10-16 19:26:50 · 374 阅读 · 0 评论 -
torch.autograd.grad与backward
1. 进行一次torch.autograd.grad或者loss.backward()后前向传播都会清空,因此想反复传播必须要加上retain_graph=True。2.torch.autograd.grad是返回一个列表,对应你所列参数的梯度。而backward()则是对parameter中的grad项进行赋值。from torch.autograd import Variableimport torchimport torch.nn as nnclass g(nn.Module):原创 2021-10-15 18:32:13 · 1311 阅读 · 1 评论 -
torch中Variable的作用
Variable可以把输出的Tensor变成一个输入变量,这样梯度就不会回传了import torchfrom option import argsimport utilityimport torch.nn as nnimport model_stage2 as model# checkpoint = utility.checkpoint(args)# model = model.Model(args, checkpoint)# print(model.parameters())# f原创 2021-10-06 22:31:45 · 2802 阅读 · 2 评论 -
F.conv2d的参数groups的作用
import torch.nn.functional as Fimport torchinputs = torch.arange(1, 21).reshape(1, 2, 2, 5)filters = torch.arange(1, 7).reshape(2, 1, 1, 3)print(inputs)print(filters)res = F.conv2d(input=inputs, weight=filters, stride=(1, 1), groups=2)print(res)...原创 2021-09-14 14:02:40 · 3120 阅读 · 0 评论 -
卷积的原理
简单来说就是从可以左右可覆盖到一个kernel的点开始卷积import numpy as npimport torchimport torch.nn.functional as F"""手动定义卷积核(weight)和偏置"""w = torch.ones(1, 1, 3, 3) # 16种3通道的5乘5卷积核"""定义输入样本"""x=torch.arange(25).view(1,1,5,5).float()print(x)print(w)"""2D卷积得到输出"""out原创 2021-08-11 10:57:43 · 154 阅读 · 0 评论 -
关于torch.round可导性问题
先上结论:不可导import torchimport torchimport torch.nn as nnclass g(nn.Module): def __init__(self): super(g, self).__init__() # self.k = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=1, padding=0, bias=False) def forward(s原创 2021-08-05 21:31:32 · 1313 阅读 · 0 评论 -
torch.scatter——一个可以与torch.topk连用的赋值函数
import torchl = torch.rand((1,3,5,5))*5a, idx1 = torch.sort(l,-1)b, idx2 = torch.sort(idx1,-1)print(l)print(a,idx1)print(b,idx2)print(l.scatter(-1,idx1,a))原创 2021-07-26 15:35:09 · 239 阅读 · 0 评论 -
关于torch.sort排序后的结果可导性问题
先上结论,可导的,会将梯度回传到排序前的import torchimport torchimport torch.nn as nnclass g(nn.Module): def __init__(self): super(g, self).__init__() #self.k = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=1, padding=0, bias=False) de原创 2021-07-26 15:03:32 · 1175 阅读 · 3 评论 -
关于torch.topK取得的元素可导性问题
先上结论是可导的,但是可导的也只有被筛选出来 那一部分import torchimport torchimport torch.nn as nnclass g(nn.Module): def __init__(self): super(g, self).__init__() #self.k = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=1, padding=0, bias=False)原创 2021-07-26 15:00:04 · 1838 阅读 · 0 评论 -
F.unfold运行解析
先上结论,unfold是先对第一通道展平,再对第二通道展平,依次叠加import cv2import numpy as npimport torchimport torch.nn.functional as Fb=1c=2h=12w=12s=torch.arange(1,b*c*h*w+1).float()s=s.view(b,c,h,w)up_factor=2kernel=3*up_factort = F.unfold(s, kernel_size=(kernel, kern原创 2021-07-06 10:21:15 · 2542 阅读 · 0 评论 -
torch反卷积转核180
好奇怪啊.torch中conv2d没有将核旋转180的习惯,但反卷积却有import torchimport torch.nn.functional as Fmodel = torch.nn.ConvTranspose2d(in_channels=1, out_channels=1, kernel_size=3,stride=1,padding=0)x = torch.tensor([[[1,2],[3,4]]], dtype=torch.float32).unsqueeze(0)model.原创 2021-06-24 22:24:06 · 231 阅读 · 0 评论 -
torch 赋值运行效率
尽量少进行赋值,一模一样的操作,赋值竟然慢了一倍import torchimport timex=torch.rand(9,256,40,40)t=100st=time.time()for i in range(t): z=torch.clamp(x+3,0,1)ed=time.time()print(ed-st)st=time.time()for i in range(t): z=x+3 z=torch.clamp(z,0,1)ed=time.time()原创 2020-10-07 12:43:25 · 366 阅读 · 0 评论 -
torch动态调整学习率的方法
发现可以通过optimzer.param_group来动态调整学习率,而且注意这里param_group出现的顺序就是param中定义的顺序。import torch.optim as optimlr1=0.1lr2=0.2params = [ {"params": filter(lambda p: p.requires_grad, self.model.a.parameters() if args.num_gpu == 1 else self.m原创 2020-09-27 14:39:58 · 730 阅读 · 0 评论 -
python中类变量和实例变量的区别
类变量只在类声明的时候初始化一遍,而实例变量在每次生成新对象时都要初始化一遍。更多细节详见:https://www.jianshu.com/p/3aca78a84defhttps://blog.csdn.net/feng98ren/article/details/80068036转载 2020-09-25 17:18:18 · 179 阅读 · 0 评论 -
forward中传出的不连续数组仍然不连续
在前向类中传出的不连续数组不会重新分配内存,所以还是不连续的import torchimport torch.nn as nnclass s(nn.Module): def __init__(self): super(s, self).__init__() def forward(self): x=torch.rand(1,5,6,7) g=x.permute(0,3,2,1) print(g.is_contigu原创 2020-09-15 21:31:57 · 109 阅读 · 0 评论 -
gather与grid_sample对比
由以下代码进行实验,发现:gather运行时间为:0.7160608768463135Sgrid_sample bilinear0.7564301490783691Sgrid_sample nearest0.5Simport torchimport timeimport torch.nn.functional as Fs=torch.rand(9,32,160,160)s=s.view(9,32,160*160)p=torch.rand(9,32,160,160)z=原创 2020-09-15 13:16:32 · 421 阅读 · 0 评论 -
转换数据类型时间损耗
将float型转换为long型估计会重新分配内存import torchimport times=torch.rand(9,32,160,160)b,c,h,w=s.size()st=time.time()for i in range(40): g=s.long()ed=time.time()print(ed-st)不换数据型1.33514404296875e-05S换数据型1.0417239665985107S耗时应该随数组增大而增大...原创 2020-09-14 22:49:45 · 521 阅读 · 0 评论 -
关于view运行速度探究
当只是生成view视图的时候,不用重新分配内存根本不耗费时间。仅仅使用permute的时间其实也就10-4量级,忽略不计。但是加上contiguous()重新分配内存后,耗时将会增加1000倍,估计还会随着数组的大小变化而变化import torchimport times=torch.rand(9,32,160,160)b,c,h,w=s.size()st=time.time()for i in range(40): g=s.view(b*c,h,w).permute(0,2,1)原创 2020-09-14 22:33:15 · 278 阅读 · 0 评论 -
torch.argmax的一些补充
torch.argmax是不会向后传梯度,但是被选中的部分还是可以传梯度的import torchs=torch.rand(1,3,6,6,requires_grad=True)d=torch.rand(1,3,6,6,requires_grad=True)p=torch.argmax(s,dim=1).unsqueeze(1)q=torch.gather(d,dim=1,index=p)q=q.sum()loss=(q-1)*(q-1)loss.backward()print(s.原创 2020-09-14 11:12:11 · 1830 阅读 · 1 评论 -
F.interpolate可导性问题
可导import torchimport torch.nn as nnclass g(nn.Module): def __init__(self): super(g, self).__init__() self.k = nn.Conv2d(in_channels=2, out_channels=1, kernel_size=1, padding=0, bias=False) def forward(self,z): a=torch.n原创 2020-09-11 20:27:40 · 2027 阅读 · 1 评论 -
F.grid_sample可导性问题
不可导import torchimport torch.nn as nnclass g(nn.Module): def __init__(self): super(g, self).__init__() def forward(self,z,grid): return torch.nn.functional.grid_sample(z, grid, align_corners=True, mode='bilinear')z=torch.rand(原创 2020-09-10 22:35:30 · 972 阅读 · 2 评论 -
对Pytorch中卷积核作为形参传递的情况探究
由以下实验代码可知,将卷积核可以作为形参传递到函数中去,且权值不会重置。import torchimport torch.nn as nndef test(s): print(s.weight)s=nn.Conv2d(in_channels=3,out_channels=3,kernel_size=1,padding=0,bias=False)#nn.init.constant_(s.weight,0)print(s.weight)test(s)a=torch.ones(1,3原创 2020-09-10 18:18:54 · 242 阅读 · 0 评论 -
softmax反向传播
详见https://zhuanlan.zhihu.com/p/37740860转载 2020-09-06 15:22:14 · 322 阅读 · 0 评论 -
自定义反向传播函数
参考https://blog.csdn.net/winycg/article/details/104410525import torchclass RoundNoGradient(torch.autograd.Function): @staticmethod def forward(ctx, x): return x.round() @staticmethod def backward(ctx, g): return torch.o原创 2020-09-06 14:24:42 · 525 阅读 · 0 评论 -
torch grid_sample
https://zhuanlan.zhihu.com/p/112030273原创 2020-09-03 19:49:36 · 1307 阅读 · 0 评论 -
【PyTorch】register_hook的使用
https://blog.csdn.net/ncc1995/article/details/97179534import torchv = torch.ones((1, 3), dtype=torch.float32, requires_grad=True)y = v**2z = y.sum()y.register_hook(lambda grad: print(grad))z.backward()print(v.grad)我认为register_hook是对这个tensor传下来的原创 2020-08-29 14:50:35 · 697 阅读 · 0 评论 -
关于torch detach clone copy的探究
可参考https://blog.csdn.net/guofei_fly/article/details/104486708看一 Clone探究Clone返回一个和源张量同shape、dtype和device的张量,与源张量不共享数据内存,但提供梯度的回溯。实验代码:import torcha = torch.tensor([1.0,2.0], requires_grad=True)a_ = a.clone()a_[0] = 6.0y = a ** 2y = y.sum()z原创 2020-08-29 14:28:04 · 675 阅读 · 0 评论