【无标题】PyTorch 常用算子说明

1.增加维度

        print(a.unsqueeze(0).shape)  # 在0号维度位置插入一个维度

        print(a.unsqueeze(-1).shape)  # 在最后插入一个维度

        print(a.unsqueeze(3).shape)  # 在3号维度位置插入一个维度

2.删减维度

        a = torch.Tensor(1, 4, 1, 9)

        print(a.squeeze().shape) # 能删除的都删除掉

        print(a.squeeze(0).shape) # 尝试删除0号维度,ok

3.维度扩展(expand)

        b = torch.rand(32)

        f = torch.rand(4, 32, 14, 14)

        # 先进行维度增加

        b = b.unsqueeze(1).unsqueeze(2).unsqueeze(0)

        print(b.shape)

        # 再进行维度扩展

        b = b.expand(4, -1, 14, 14)  # -1表示这个维度保持不变,这里写32也可以

        print(b.shape)                  

         输出:

         torch.Size([1, 32, 1, 1])

        torch.Size([4, 32, 14, 14])

4.维度重复(repeat)

        print(b.shape)

        # 维度重复,32这里不想进行重复,所以就相当于"重复至1次"

        b = b.repeat(4, 1, 14, 14)

        print(b.shape)

        输出:

        torch.Size([1, 32, 1, 1])

        torch.Size([4, 32, 14, 14])

5.转置

        只适用于dim=2的Tensor。

        c = torch.Tensor(2, 4)

        print(c.t().shape)

        输出:

        torch.Size([4, 2])

  6. 维度交换

       d = torch.Tensor(6, 3, 1, 2)

        print(d.transpose(1, 3).contiguous().shape)  # 1号维度和3号维度交换

        输出:

        torch.Size([6, 2, 1, 3])

  7. permute

        h = torch.rand(4, 3, 6, 7)

        print(h.permute(0, 2, 3, 1).shape)

        输出:

        torch.Size([4, 6, 7, 3])

  8.gather

        1)input:输入

        2)dim:维度,常用的为0和1

        3)index:索引位置

        a=t.arange(0,16).view(4,4)

        print(a)

        index_1=t.LongTensor([[3,2,1,0]])

        b=a.gather(0,index_1)

        print(b)

        index_2=t.LongTensor([[0,1,2,3]]).t()#tensor转置操作:(a)T=a.t()

        c=a.gather(1,index_2)

        print(c)

        outout输出:

        tensor([[ 0,  1,  2,  3],

                         [ 4,  5,  6,  7],

                [ 8,  9, 10, 11],

                [12, 13, 14, 15]])

                tensor([[12,  9,  6,  3]])

        tensor([[ 0],

                   [ 5],

                  [10],

                  [15]])

        在gather中,我们是通过index对input进行索引把对应的数据提取出来的,而dim决定了索引的方式。

9.Chunk

             torch.chunk(tensor, chunks, dim=0)

              在给定维度(轴)上将输入张量进行分块儿

             直接用上面的数据来举个例子:

             l, m, n = x.chunk(3, 0) # 在 0 维上拆分成 3 份

             l.size(), m.size(), n.size()

              (torch.Size([1, 10, 6]), torch.Size([1, 10, 6]), torch.Size([1, 10, 6]))

                u, v = x.chunk(2, 0) # 在 0 维上拆分成 2 份

                u.size(), v.size()

        (torch.Size([2, 10, 6]), torch.Size([1, 10, 6]))

10.Stack

              合并新增(stack)

              stack需要保证两个Tensor的shape是一致的。

                c = torch.rand(4, 3, 32, 32)

                d = torch.rand(4, 3, 32, 32)

                print(torch.stack([c, d], dim=2).shape)

                print(torch.stack([c, d], dim=0).shape)

        运行结果:

                torch.Size([4, 3, 2, 32, 32])

                torch.Size([2, 4, 3, 32, 32])

11.View

        Pytorch中的view函数主要用于Tensor维度的重构,即返回一个有相同数据但不同维度的Tensor。

a3 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
                   13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
a4 = a3.view(4, -1)
a5 = a3.view(2, 3, -1)

输出:

#a3

tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
        19, 20, 21, 22, 23, 24])

#a4

tensor([[ 1,  2,  3,  4,  5,  6],
        [ 7,  8,  9, 10, 11, 12],
        [13, 14, 15, 16, 17, 18],
        [19, 20, 21, 22, 23, 24]])

#a5
tensor([[[ 1,  2,  3,  4],
         [ 5,  6,  7,  8],
         [ 9, 10, 11, 12]],
        [[13, 14, 15, 16],
         [17, 18, 19, 20],
         [21, 22, 23, 24]]])

12.reshape

        返回与 input张量数据大小一样、给定 shape的张量。如果可能,返回的是input 张量的视图,否则返回的是其拷贝。

a1 = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
a2 = torch.reshape(a1, (3, 4))
print(a1.shape)
print(a1)
print(a2.shape)
print(a2)

运行结果:

torch.Size([12])
tensor([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])
torch.Size([3, 4])
tensor([[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]])

同view函数,也可以自动推断维度:a4 = torch.reshape(a1, (-1, 6))


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值