实现上采样
import torch.nn as nn
nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None)
nearest
,linear
,bilinear
,bicubic
, trilinear五种
。默认使用nearest
;'linear'
, 'bilinear'
or 'trilinear'时使用。
默认设置为
False。
事实上对于做深度学习的人来讲,torch.cat用得是非常频繁的。特别实在目标检测算法中,我们经常需要进行不同维度的特征拼接,特征融合,这些大都是需要用到torch.cat。好的 废话少说,我们开始学torch.cat。
torch.cat是将两个张量拼接在一起,torch.cat((a, b ) , dim),这里a , b即为需要拼接的两个张量,dim为拼接的维度,当dim=0的时候为按 行 方向进行拼接,当dim = 1的时候为按照列的方向进行拼接。
顾名思义就是将不同维度的数进行维度更换,因为在pytorch的运算处理当中,经常会出现多维度张量,而且不同维度的经常需要更换,因此我们就用到这个函数。
import torch
a = torch.randn(32 , 3 , 85 , 13 , 13)
b = a.permute(0 , 1 , 3 , 4 , 2)
print(b.shape)
输出结果:
(32 , 3 , 13 , 13 , 85)
为了方便我们使用,我们用最简单的方法讲解函数最实用的用处,不深究原理。
pytorch里面的view()可以理解成numpy里面的resize(),都是对数据进行重新调整改变他的shape。
例如:原来数据a的shape是(6*8),a.view(24*2),则数据就会从6行8列,变成24行2列。
对于pytorch中的contiguous()函数,不同的人有不同的理解,在我的理解中我把他理解成一个深拷贝函数。
a.contiguous()方法常与a.permute()、a.transpose()、a.view()方法同时使用,对于这三个方法来说他们不会改变a在底层的存储方式,只是将输出形式以我们想看见的方式输出了(即只是改变了张量的输出形状)并没有开辟新内存,存储这个数据,如果对于想创建一个完全跟上诉脱离的数,则需要加.contiguous(),将数据深度拷贝,即copy了一个新数据跟之前的没有关联。
这个可以理解成张量切片,本来这个想自己写的但是这位大佬写的太好了,直接看这位大佬写的把。
【python函数】torch.index_select()函数用法解析_风巽·剑染春水的博客-CSDN博客
这两个的作用都是从正在进行的梯度张量运算中获取他的tensor值,他俩有相同的地方也有不同的地方。.data 和.detach都只取出本体tensor数据,舍弃了grad,grad_fn等额外反向图计算过程需保存的额外信息。就是将一个啰嗦的量,只获取他本身的值。
相同地方:-两者都是与原来的数据共享一个数据
-都是require s_grad = False
不同地方:-在进行反向传播的过程中如果会修改原数据,而.data会直接根据修改后的跟原数据不同的值进行错误的计算,而.detach会直报错,告诉你数据修改了。总之就是.detach会跟原来的数据还有关联,而且.data已经没有关联了,.detach如果发现原来的数据有变化了会告诉你,但是.data就会按照错误的走下去。
[..., i]相当于[:, :, … :, i],两者的效果是相等的,几个点就对应几个冒号。
例如[..., i]对应[:, :, :, i],[...., i]对应[:, :, : , : , i]。
可以将多维数据理解成切片,就是一层一层的片堆叠在一起,这样就方便理解我们这个的作用,就是为了提取相应的那一片数据,这一片可能从第一个维度的提取,也可以第二个维度等。
import torch
a = torch.rand((2, 8, 42, 4)) # 有4片数据
b = a[..., 0] # 取第1片上的所有数据 ,数据size=[2,8,42]
c = a[:, :, :, 0] # 取第1片上的所有数据 ,数据size=[2,8,42]
print(b.size())#类似数组切片
print(c.size())#一堆维度的贴片粘在一起,依次取第几维的
d = torch.rand((8, 42, 4))
b1 = d[..., 0] # 取第1片上的所有数据 ,数据size=[8,42]
c1 = d[:, :, 0] # 取第1片上的所有数据 ,数据size=[8,12]
c2 = d[:, 40] # 取42个片上的第一行第一列的数据 数据size=[8,4]
# print(b1, c2)
print(b1.size(),c1.size(), c2.size())
torch.Size([2, 8, 42])
torch.Size([2, 8, 42])
torch.Size([8, 42]) torch.Size([8, 42]) torch.Size([8, 4])
有用的话麻烦点一下关注,博主后续会开源更多代码,非常感谢支持!