日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【解决办法】torch交叉熵使用时遇到 Dimension out of range

發布時間:2025/4/16 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【解决办法】torch交叉熵使用时遇到 Dimension out of range 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡述

其實這個問題我很久以前用pytorch寫程序的時候就遇到過這個問題,當時糾結了很久之后最后解決了。當時本來就想來寫個東西來記錄下避免其他人也遇到這樣的問題。但后面我個菜雞就完全忘記了emmmm

展示說明

不同于我以往直接給出結論。這次我會通過展示的方式較為詳細的講解下。

  • 導入包
import torch import torch.nn as nn
  • 創造這個損失函數類
loss = nn.CrossEntropyLoss()
  • 隨機生成下這個數據A
A = torch.randn(3, 5, requires_grad=True)

內容如下:

A tensor([[ 1.0483, -1.4251, 1.0502, 0.2437, 0.1477],[-0.1300, -1.0798, -1.0835, -1.0473, 1.2076],[-0.1647, -1.1366, 0.7088, 1.3719, 1.9135]], requires_grad=True)
  • 隨機生成3個label
target = torch.empty(3, dtype=torch.long).random_(5)

內容如下:

target tensor([2, 2, 3])

沒有問題

output = loss(A, target)
  • 這時候就是沒有問題的
output tensor(1.6934, grad_fn=<NllLossBackward>)

有問題的情況演示

  • 將前面創建的A在一維上取argmax。得到對應的label
A_arg = torch.argmax(A, dim=1)

內容如下:

A_arg tensor([2, 4, 4])
  • 調用,出現題目所示的bug
output = loss(A_arg, target)

報錯非常一大串emmm。關鍵就是下面這句。

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

解釋

其實就是因為torch的交叉熵的輸入第一個位置的輸入應該是在每個label下的概率, 而不是對應的label。

所以直接寫成label的你,就出現上面所說的錯誤了。

NLLoss還是CE兩者都是類似的。第一個輸入為每個樣本在不同label下的概率值(矩陣),第二個輸入為label。注意,這里的label本質上都是概率矩陣在列方向上的index(也就是對應于某個樣本的index類別)

總結

以上是生活随笔為你收集整理的【解决办法】torch交叉熵使用时遇到 Dimension out of range的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。