【问题标题】:What does "unsqueeze" do in Pytorch?Pytorch 中的“unsqueeze”是做什么的?
【发布时间】:2019-12-05 19:41:43
【问题描述】:

我无法理解PyTorch documentation 中的示例如何对应解释:

返回一个插入到指定位置的尺寸为 1 的新张量。 [...]

>>> x = torch.tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
tensor([[ 1,  2,  3,  4]])
>>> torch.unsqueeze(x, 1)
tensor([[ 1],
        [ 2],
        [ 3],
        [ 4]])

【问题讨论】:

    标签: python pytorch torch


    【解决方案1】:

    如果您查看前后数组的形状,您会发现它之前是(4,),之后是(1, 4)(当第二个参数是0)和(4, 1)(当第二个参数是1)。因此,1 被插入到数组的形状中,位于轴 01,具体取决于第二个参数的值。

    这与 np.squeeze()(从 MATLAB 借用的命名法)相反,它删除大小为 1(单例)的轴。

    【讨论】:

      【解决方案2】:

      表示添加维度的位置。 torch.unsqueeze 为张量增加了一个额外的维度。

      假设你有一个形状为 (3) 的张量,如果你在 0 位置添加一个维度,它将是形状 (1,3),即 1 行 3 列:

      • 如果您有一个形状为 (2,2) 的二维张量,请在 0 位置添加一个额外的维度,这将导致张量的形状为 (1,2,2) ,表示一个通道,2行2列。如果在 1 位置添加,则形状为 (2,1,2),因此将有 2 个通道,1 行和 2 列。
      • 如果在1位置添加,则为(3,1),即3行1列。
      • 如果在2位置添加,则张量的形状为(2,2,1),即2通道2行1列。

      【讨论】:

        【解决方案3】:

        unsqueeze 转为 n.d.张量成 (n+1).d。一个是通过添加一个深度为 1 的额外维度。但是,由于新维度应该位于哪个轴上(即它应该“未压缩”的方向)是不明确的,这需要由 dim 参数指定。

        例如unsqueeze 可以通过三种不同的方式应用于二维张量:

        得到的未压缩张量具有相同的信息,但用于访问它们的索引不同。

        【讨论】:

        • 也许将其描述为 nxd 会更好,n.d.感觉就像一个缩写。
        • @KubraTas "n.d." 缩写(“n维”)。
        • 哦好吧,但显然第一眼看不清楚。
        • 添加维度的值是多少,是否全为零?你能帮我解决这个问题吗..
        • @ZKS 没有添加额外的值。张量的体积是一样的。
        【解决方案4】:

        我不确定为什么这里没有提到 PyTorch 引用,因为这是 PyTorch 的遗留问题。

        torch.squeeze(input, dim=None, *, out=None) → 张量

        返回一个张量,其中所有尺寸为 1input 的维度都已删除。

        例如,如果输入的形状为:(A×1×B×C×1×D),那么输出张量的形状为:(A×B×C×D)。

        当给定dim 时,只在给定维度上进行挤压操作。如果 input 的形状为: (A×1×B) ,squeeze(input, 0) 保持张量不变,但 squeeze(input, 1) 会将张量压缩到形状 (A×B) 。

        torch.unsqueeze(input, dim) → 张量

        返回一个新张量,尺寸为一,插入指定位置。

        返回的张量与该张量共享相同的基础数据。

        可以使用[-input.dim() - 1, input.dim() + 1) 范围内的dim 值。否定的dim 将对应于在dim = dim + input.dim() + 1 应用的unsqueeze()

        【讨论】:

          【解决方案5】:

          unsqueeze 是一种改变张量维度的方法,使得张量乘法等操作成为可能。这基本上改变了维度以产生具有不同维度的张量。

          例如:如果您想将大小为 (4) 的张量与大小为 (4, N, N) 的张量相乘,则会出现错误。 但是使用 unsqueeze 方法,您可以将张量转换为大小 (4,1,1)。现在,由于它有一个大小为 1 的操作数,您将能够将两个张量相乘。

          【讨论】:

            猜你喜欢
            • 2018-08-01
            • 2017-08-09
            • 2018-12-28
            • 2020-10-14
            • 2021-11-21
            • 1970-01-01
            • 1970-01-01
            • 2019-05-22
            • 2020-04-24
            相关资源
            最近更新 更多