tensor的维度变换

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]
posted @ 2020-09-01 10:33  Jason66661010  阅读(1181)  评论(0编辑  收藏  举报