今天上午心情起伏很大,本以為找到了**中的錯誤,結果發現並不是這麼回事。
第一,看了幾篇部落格發現,分類問題的標籤應該用one hot(獨熱碼),而我一直用的是普通數字(我的專案一共是四分類,所以用的是0,1,2,3)。本來想著趕緊回去改,幸好又看到一偏部落格說pytorch在計算交叉熵時回自動將結果轉換成one hot編碼再計算。將信將疑的我去用**驗證了一下,發現的確如此,所以並不需要修改這個啦。(而且如果你想用獨熱碼的向量作為標籤pytorch好像還不支援,好像只支援一維的)
第二,我的cnn輸出並沒有加softmax層。本來想加上,又看到一篇部落格說加和不加算出來的結果是一樣的。於是我又去驗證了一下。發現直接用全連線層輸出計算和加f.softmax()計算出的值是不一樣的,但和f.log_softmax()計算結果相等,所以可以理解為是預設加了log_softmax()層。
log_softmax驗證:
a=torch.tensor([[
0.0189
,0.1621,-
0.1308,-
0.1770]]
)label=torch.tensor([2
])b=f.log_softmax(a,dim=1)
print
(b)l=loss(a,label)
l2=loss(b,label)
print
(l)print
(l2)
tensor([[
-1.3447,-
1.2015,-
1.4944,-
1.5406]]
)tensor(
1.4944
)tensor(
1.4944
)
one hot驗證:1到0的距離等於1到3的距離
a=torch.tensor([[
0.1,
0.7,
0.1,
0.1]])
label=torch.tensor([1
])label2=torch.tensor([3
])label3=torch.tensor([0
])l1=loss(a,label)
l2=loss(a,label2)
l3=loss(a,label3)
print
(l1)
print
(l2)
print
(l3)
```python
tensor(
0.9732
)tensor(
1.5732
)tensor(
1.5732
)
如果labe=4會報錯 out of bound,說明四分類的標籤只能是0,1,2,3而不能是1,2,3,4。
最後,小白表示,如有錯誤請各位包涵!也請各位前輩不吝賜教!謝謝!
熵與交叉熵
針對引文中的問題 如果乙個字出現的頻率為yi 則該字所使用的編碼bit數為lo g1yi 如果整段文字的概率分布都已知,那我們可以得出編碼乙個字所需的最優bit數 h y iyil og1y i 其中h y 就是熵 如果我們已知的是乙個錯誤的分布,並且使用該分布確定的編碼bit數,稱為交叉熵h y ...
tensorflow中的幾種交叉熵
準備1 先說一下什麼是logit,logit函式定義為 是一種將取值範圍在 0,1 內的概率對映到實數域 inf,inf 的函式,如果p 0.5,函式值為0 p 0.5,函式值為負 p 0.5,函式值為正。相對地,softmax和sigmoid則都是將 inf,inf 對映到 0,1 的函式。在te...
cross entropy交叉熵 相對熵
1.熵用來表示所有資訊量的期望。2.相對熵又稱kl散度,如果我們對於同乙個隨機變數 x 有兩個單獨的概率分布 p x 和 q x 我們可以使用 kl 散度 kullback leibler kl divergence 來衡量這兩個分布的差異。3.交叉熵 相對熵 p的熵 交叉熵。在機器學習中,我們需要...