理解重塑张量时的顺序

Understanding the order when reshaping a tensor(理解重塑张量时的顺序)
本文介绍了理解重塑张量时的顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于张量:

x = torch.tensor([
    [
        [[0.4495, 0.2356],
          [0.4069, 0.2361],
          [0.4224, 0.2362]],
                   
         [[0.4357, 0.6762],
          [0.4370, 0.6779],
          [0.4406, 0.6663]]
    ],    
    [
        [[0.5796, 0.4047],
          [0.5655, 0.4080],
          [0.5431, 0.4035]],
         
         [[0.5338, 0.6255],
          [0.5335, 0.6266],
          [0.5204, 0.6396]]
    ]
])
首先要将其拆分为2(x.Shape[0])张量,然后将它们合并。在这里,只要我得到正确的输出,我就不需要真正地拆分它,但在视觉上,拆分它然后再将它们合并在一起对我来说更有意义。

例如:

# the shape of the splits are always the same
split1 = torch.tensor([
    [[0.4495, 0.2356],
    [0.4069, 0.2361],
    [0.4224, 0.2362]],

    [[0.4357, 0.6762],
    [0.4370, 0.6779],
    [0.4406, 0.6663]]
])
split2 = torch.tensor([
    [[0.5796, 0.4047],
    [0.5655, 0.4080],
    [0.5431, 0.4035]],

    [[0.5338, 0.6255],
    [0.5335, 0.6266],
    [0.5204, 0.6396]]
])

split1 = torch.cat((split1[0], split1[1]), dim=1)
split2 = torch.cat((split2[0], split2[1]), dim=1)
what_i_want = torch.cat((split1, split2), dim=0).reshape(x.shape[0], split1.shape[0], split1.shape[1])

对于上面的结果,我认为直接重塑x.rehape([2,3,4])会起作用,它产生了正确的尺寸,但结果不正确。

总的来说,我是:

  1. 不确定如何将张量拆分为x.Shape[0]张量。
  2. 对重塑的工作原理感到困惑。大多数时候我都能把尺寸弄对,但数字的顺序总是错的。

谢谢

推荐答案

据我所知,你有一个形状为(B,C,H,W)的张量,你想把它转换成(B,H,C*W)。为此,您需要执行以下两个步骤

  1. x的维度重新排列为(B,H,C,W),以具有名为y的新张量
  2. y重塑为(B,H,C*W)以获得最终结果

x重塑为(B,H,C,W)而不是(B,H,W,C)的原因是

  • 您希望由具有相同行索引的x(即您通过1234指示的3x2矩阵)的子矩阵行连接而成的结果中有一行。
  • Pytorch的reshape函数以行为主的方式运行。

因此,需要将行放在彼此的顶部,以便重塑才能返回所需的顺序。

按照上述推理,获取what_i_want的代码为

what_i_want = x.permute(0, 2, 1, 3).reshape(2, 3, 4)

这篇关于理解重塑张量时的顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)