尺寸超出范围(预计在 [-1, 0] 范围内,但得到 1)(pytorch)

Posted

技术标签:

【中文标题】尺寸超出范围(预计在 [-1, 0] 范围内,但得到 1)(pytorch)【英文标题】:Dimension out of range (expected to be in range of [-1, 0], but got 1) (pytorch) 【发布时间】:2021-08-26 18:51:59 【问题描述】:

我有一个非常简单的前馈神经网络(pytorch)

import torch
import torch.nn.functional as F
import numpy as np
class Net_1(nn.Module):
    def __init__(self):
        super(Net_1, self).__init__() 
        self.fc1 = nn.Linear(5*5, 64) 
        self.fc2 = nn.Linear(64, 32)
        self.fc3 = nn.Linear(32, 3)

    def forward(self,x):
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return F.log_softmax(x, dim=1)
net = Net_1()

输入是这个 5x5 numpy 数组

state = [[0, 0, 3, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 2, 1, 0, 0],
        [0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0]]
state = torch.Tensor(state).view(-1)

net(state) 抛出以下错误

Dimension out of range (expected to be in range of [-1, 0], but got 1)

问题在于何时应用 F.log_softmax()

【问题讨论】:

【参考方案1】:

当您调用return F.log_softmax(x, dim=1) 时,x 是形状为torch.Size([3]) 的一维张量。

pytorch 中的维度索引从 0 开始,因此您不能将 dim=1 用于一维张量,您需要使用 dim=0

return F.log_softmax(x, dim=1) 替换为return F.log_softmax(x, dim=0),就可以了。

将来您可以通过向前添加 print(x.shape) 来检查张量大小。

【讨论】:

【参考方案2】:

您正在为您的 log_softmax 函数提供一个 3 元素一维数组。

当说 dim=1 时,您是在告诉它将 softmax 应用于不存在的轴。

只需为一维数组设置 dim=0。

更多关于这个函数和这个参数的含义here

【讨论】:

以上是关于尺寸超出范围(预计在 [-1, 0] 范围内,但得到 1)(pytorch)的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:索引 -9223372036854775808 超出尺寸 2 的维度 1 的范围

来自 Ghostscript 的页面超出范围错误的 PDF 尺寸

带有asset.tracks(withMediaType :)的空NSArray的索引0超出范围

索引超出范围但实际上在范围内[关闭]

匹配两个数字文件以超出范围和范围内

echarts 超出设定范围显示不同的颜色