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

What is a dimensional range of [-1,0] in Pytorch?

所以我很难理解 Pytorch 中关于集合的一些术语。我将 运行 归入关于我的张量的 范围 不正确的相同类型的错误,当我尝试 Google 寻求解决方案时,解释通常更进一步令人困惑。

这是一个例子:

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

我没有发现上面的代码有什么问题,我已经将我的 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)

这是什么意思?

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

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

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

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

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

这样可行,但我不明白 [-1,0] 如何解释嵌套集合。

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

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

所以dim=1表示集合的集合,但我不明白[-1, 0]是什么意思。

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

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

以上给出了以下错误:

IndexError: Dimension out of range (expected to be in range of [-2, 1], but got 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)

我对这个术语感到非常困惑 [-1, 0][-2, 1]?

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

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

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

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

  • "batch" 维度(第一个)可以作为 dim=0dim=-4 访问。
  • "channel" 维度(第二个)可以通过 dim=1dim=-3 访问。
  • "height"/"vertical" 维度(第三个)可以通过 dim=2dim=-2 访问。
  • "width"/"horizontal" 维度(第四个)可以作为 dim=3dim=-1.
  • 访问

因此,如果您有一个 4D 张量 dim 参数可以取 [-4, 3].

范围内的值

在你的例子中,你有一个一维张量,因此 dim 参数可以是 0 或 -1(在这个弃用的例子中相当于相同的维度)。