zoukankan      html  css  js  c++  java
  • 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]
    
  • 相关阅读:
    jquery属性
    jquery选择器
    Django的模型
    win7安装RabbitMQ
    阿里云RDS备份的tar格式包恢复到本地自建数据库
    正确使用 Volatile 变量
    深入分析Volatile的实现原理
    volatile和synchronized的区别
    全面理解Java内存模型
    深入理解Feign之源码解析
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13594767.html
Copyright © 2011-2022 走看看