Skip to content

[已解決][PyTorch] IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)

Last Updated on 2021-07-05 by Clay

今天在偶然的情況下,我遭遇了這個報錯 (其時報錯的不是我的 Code):

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

上網查了一下,發現這個問題其實滿好解決的:這通常是發生在 CrossEntropyLoss() 上的報錯,而 CrossEntropyLoss() 輸入的第一項應為『預測分類的機率分佈』。若是直接使用 argmax() 輸入標籤結果,那就有可能會產生這個報錯。


範例

比如說我們以以下這樣的資料輸入 CrossEntropyLoss() 當中:

import torch
import torch.nn as nn

a = torch.tensor([1, 2, 3])
b = torch.tensor([1, 0, 1])

print(nn.CrossEntropyLoss()(a, b))



Output:

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

我們就會得到這樣的報錯。

所以,我們輸入的第一項 "a",應該為一個機率分佈才對。修正如下:

import torch
import torch.nn as nn

a = torch.tensor([[-0.8, -0.2], [-0.2, -0.3], [-0.24, -0.35]]).float()
b = torch.tensor([1, 0, 1])

print(nn.CrossEntropyLoss()(a, b))



Output:

tensor(0.6105)

可以看到,若是機率分佈的情況,則 CrossEntropyLoss() 可以正常運作。

最後來解釋為什麼我會說不是我的 Code 報錯呢?因為我選擇以 batch_size=1 的情況來測試已經訓練好的模型,結果在 PyTorch 原始碼的 "Module" 區塊報錯了。進去一看,才發現了有這樣的問題。

然後說來好笑,改成 batch_size=2 就成功運作了。


References


Read More

Leave a Reply