Pytorch 中 [-1,0] 的维度范围是多少?

Rea*_*lar 7 python softmax pytorch tensor

所以我很难理解一些关于 Pytorch 集合的术语。我不断遇到关于我的张量范围不正确的相同类型的错误,当我尝试谷歌寻找解决方案时,解释往往更加混乱。

下面是一个例子:

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([0.3300, 0.3937, -0.3113, -0.2880])
output = m(input)
Run Code Online (Sandbox Code Playgroud)

我没有发现上面的代码有什么问题,我已经定义LogSoftmax了接受一维输入。所以根据我使用其他编程语言的经验,集合[0.3300, 0.3937, -0.3113, -0.2880]是一个单一的维度。

以上触发了以下错误m(input)

IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Run Code Online (Sandbox Code Playgroud)

这意味着什么?

我传入了一个一维张量,但它告诉我它期望的范围是[-1, 0], but got 1.

  • 什么范围?
  • 为什么比较1to的维度会出现错误[-1, 0]
  • 这两个数字[-1, 0]是什么意思?

我搜索了这个错误的解释,我发现像这个链接这样的东西对我作为一个程序员来说毫无意义:

https://github.com/pytorch/pytorch/issues/5554#issuecomment-370456868

因此,我能够通过向张量数据添加另一个维度来修复上述代码。

IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Run Code Online (Sandbox Code Playgroud)

所以这是有效的,但我不明白如何[-1,0]解释嵌套集合。

进一步的实验表明以下方法也有效:

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([[-0.3300, 0.3937, -0.3113, -0.2880]])
output = m(input)
Run Code Online (Sandbox Code Playgroud)

所以dim=1意味着集合的集合,但我不明白这意味着什么[-1, 0]

当我尝试使用 LogSoftmax(dim=2)

m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([[0.0, 0.1], [1.0, 0.1], [2.0, 0.1]])
output = m(input)
Run Code Online (Sandbox Code Playgroud)

以上给了我以下错误:

IndexError:维度超出范围(预期在 [-2, 1] 范围内,但得到 2)

再次混淆dim=2等于[-2, 1],因为1值从何而来?

我可以通过将集合嵌套到另一个级别来修复上面的错误,但此时我不明白LogSoftmax期望的是什么值。

m = torch.nn.LogSoftmax(dim=2)
input = torch.tensor([[0.0, 0.1], [1.0, 0.1], [2.0, 0.1]])
output = m(input)
Run Code Online (Sandbox Code Playgroud)

我对这个术语[-1, 0][-2, 1]?

如果第一个值是嵌套深度,那么为什么它是负数,第二个数字是什么意思?

没有与此错误相关的错误代码。因此,很难找到有关该主题的文档。这似乎是一个非常常见的错误,人们对此感到困惑,我在 Pytorch 文档中找不到任何专门讨论它的错误。

Sha*_*hai 6

当指定张量的维度作为函数的参数时(例如m = torch.nn.LogSoftmax(dim=1)),您可以使用维度索引,第一个维度从 0 开始,第二个维度从 1 开始,依此类推。
或者,您可以使用维度索引从最后一个维度开始到第一个:-1 表示最后一个维度,-2 表示倒数第二个维度,等等。

示例:
如果您有一个尺寸为b-by- c-by- h-by-的 4D 张量w,则

  • “批量”维度(第一个)可以通过 或 来dim=0访问dim=-4
  • “通道”维度(第二个)可以通过 或 来dim=1访问dim=-3
  • dim=2“高度”/“垂直”尺寸(第三个)可以通过或访问dim=-2
  • dim=3“宽度”/“水平”尺寸(第四个)可以通过或访问dim=-1

因此,如果您有 4D 张量dim参数,则可以取 范围内的值[-4, 3]

在您的情况下,您有一个一维张量,因此dim参数可以是 0 或 -1 (在这种不推荐使用的情况下等于相同的维度)。