日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【解决办法】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的全部內容,希望文章能夠幫你解決所遇到的問題。

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