tensor的维度变换
view以及reshape的用法
例子:
a = torch.rand(4,1,28,28)
a.view(4,28*28)
解读:其实就是将图片的通道数、图片的像素行列值都合并在一起,成为【4,784】,适合全连接层的输入。
例子2:
a = torch.rand(4,1,28,28)
a.view(4*1,28,28)
表示我们现在只关注feature map这个属性,而不关注它来自哪个图片的哪个通道
注意在view之后如果想恢复到原来的维数是要进行记录的,否则直接恢复是不行的。
squeeze与unsqueeze用法
unsqueeze
在相应的index的维度添加一维
例子:
a = torch.rand(4,1,28,28)
a.unsqueeze(0)
a.shape
#[1,4,1,28,28]
unsqueeze的参数是index,而index的范围是[-a.dim()-1,a.dim()+1)
-5 -4 -3 -2 -1
[ 4 , 1 , 28 , 28 ]
0 1 2 3 4
⭐如果是0 1 2 3 4的话就是在0 1 2 3 4的前面插入一维,而如果是-5 - 4- 3- 2 -1的话就是在-5 - 4- 3- 2 -1的后面插入一维
⭐例子二:
a = a.torch.tensor([1.2,2.3])#这里的数据的维度为【2】
a.unsqueeze(-1)#在最后一个后面添加一维:【2,1】
#[ [1.2] , [2.3] ] 于是就是先是两维,然后是一维
a.unsqueeze(0)#在第一维前面添加一维“【1,2】
#[ [1.2 , 2.3] ] 于是就是先是一维,里面是两维
⭐实例:
f表示4张14*14的拥有32个通道的图片,而b表示给图片的每个channel上的所有的像素添加一个偏置,我们的目标就是把b叠加在f上面,所以要将b的维度变换与f相同才可以进行,然后再进行b的扩张。
b = torch.rand(32)
f = torch.rand(4,32,14,14)
b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)
#[32] [32,1] [32,1,1] [1,32,1,1]
squeeze
删减维度,如果没有参数的话会把所有能进行删减的都删减了。
例子:
b = torch.randn(1,32,1,1)
b = b.squeeze()#所有维数是1的全部删掉
#[32]
squeeze的索引是指哪个就删哪个,除非该维度的维数不是1就不能删
expand与repeat用法
进行维度的扩展,就像前面的b【1,32,14,14】,要想与f【4,32,14,14】进行相加的话,b就要进行维度的扩展。
两种方法的区别:
两种方法在效果方面是等效的,但是expand只在需要的时候进行数据的复制,而repeat会直接复制数据。所以推荐使用expand
expand
例子:
b = torch.randn(1,32,1,1)
b.expand(4,32,14,14)
#[4,32,14,14]
局限性:
1.要求expand之前之后的dimension必须一样。
2.只能在之前维数为1的地方进行expand,而如果之前的维数为3是没有办法扩张到m的。
【3,32,14,14】——b.expand(4,32,14,14)报错
例子2:不像进行变动的地方使用-1代替就可以
b = torch.randn(1,32,1,1)
b.expand(4,32,-1,-1)
#[4,32,1,1]
repeat
repeat的参数表示你要在该维数位置进行多少次复制
例子:
b = torch.randn(1,32,1,1)
b.repeat(4,32,1,1)
#[ 4 , 1024 , 1 , 1 ]
表示1复制4次变为4,32复制32次变为1024,其它没变
.t()转置
进行tensor的转置,但是要注意:只能进行2D tensor的转置,即矩阵的转置。
transpose转置
进行某几维之间的相互交换
例子:
b = torch.randn(4,3,32,32)
b = b.transpose(1,3)
#[4,32,32,3]
# 0 1 2 3
例子2:这样变换前后的二者是一样的(contiguous()表示进行transpose之后数据不再是按顺序存放的,使用该方法进行顺序的调整)
a2 = b.transpose(1,3).contiguous().view(4,3*32*32).view(4,3,32,32).transpose(1,3)
注意:[B C H W] → [B W H C] → [B W * H * C] →[B C W H]这样的变换是不行的 W与H的顺序变换了,图像也会处出现变换
⭐例子3:
a = torch.rand(4,3,28,28)#[B C H W]
a.transpose(1,3)#[B W H C]
a.transpose(1,2)#[B H W C]
由于[B H W C]是numpy中储存图片的方式,所以这样变换以后才能导出numpy
permute函数
transpose中的例子3使用permute函数进行简单的一步变换:
a = torch.rand(4,3,28,28)#[B C H W]
a.permute(0,2,3,1)#[B H W C]