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
- https://github.com/pytorch/pytorch/issues/5554
- https://github.com/huggingface/transformers/issues/628
- https://discuss.pytorch.org/t/indexerror-dimension-out-of-range-expected-to-be-in-range-of-1-0-but-got-1/54267
Read More
- [已解決][PyTorch] TypeError: not a sequence
- [已解決][PyTorch] RuntimeError: bool value of Tensor with more than one value is ambiguous
- [已解決][PyTorch] ValueError: expected sequence of length 300 at dim 1 (got 3)
- [已解決][PyTorch] AttributeError: ‘tuple’ object has no attribute ‘size’
- [已解決][PyTorch] RuntimeError: Expected object of scalar type Float but got scalar type Long for argument
- [已解決][PyTorch] LSTM RuntimeError: input must have 3 dimensions, got 2