nn.KLDivLoss
生活随笔
收集整理的這篇文章主要介紹了
nn.KLDivLoss
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
KLDivLoss
作用:
? ? ?用于連續分布的距離度量;并且對離散采用的連續輸出空間分布進行回歸通常很有用;用label_smoothing就采用這個;
公式:
? ? ? ? ? ? ?
? ? ? ? ? ??
?
公式理解:
? ? ?p(x)是真實分布,q(x)是擬合分布;實際計算時;通常p(x)作為target,只是概率分布;而xn則是把輸出做了LogSoftmax計算;即把概率分布映射到log空間;所以
K-L散度值實際是看log(p(x))-log(q(x))的差值,差值越小,說明擬合越相近。
?
pytorch使用:
?
當前版本torch(1.3.1)要想獲得真正的KL散度;設置:
reduce=False;size_average=False
(reduce默認也是True,返回所有元素loss的和;size_average=默認是True,是對batch中每個元素進行求平均,當為False時,返回各樣本各維度的loss之和;
因為reduce為False會忽略size_average參數,所以其實只需要把reduce=False即可)
代碼驗證:
import torchimport torch.nn as nnimport numpy as np# ----------------------------------- KLDiv lossloss_f = nn.KLDivLoss(size_average=False, reduce=False)loss_f_mean = nn.KLDivLoss(size_average=True, reduce=True)# 生成網絡輸出 以及 目標輸出output = torch.from_numpy(np.array([[0.1132, 0.5477, 0.3390]])).float()output.requires_grad = Truetarget = torch.from_numpy(np.array([[0.8541, 0.0511, 0.0947]])).float()loss_1 = loss_f(output, target)loss_mean = loss_f_mean(output, target)print('\nloss: ', loss_1)print('\nloss_mean: ', loss_mean)# 熟悉計算公式,手動計算樣本的第一個元素的loss,注意這里只有一個樣本,是 element-wise計算的output = output[0].detach().numpy()output_1 = output[0] # 第一個樣本的第一個元素target_1 = target[0][0].numpy()loss_1 = target_1 * (np.log(target_1) - output_1)print('\n第一個樣本第一個元素的loss:', loss_1?
鏈接:https://github.com/TingsongYu/PyTorch_Tutorial/blob/master/Code/3_optimizer/3_1_lossFunction/6_KLDivLoss.py
?
Note:
D(p||q) ≠ D(q||p) ,不具有對稱性所以不能稱之為K-L距離
總結
以上是生活随笔為你收集整理的nn.KLDivLoss的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动画在游戏中的作用
- 下一篇: 一个关于中国省市区的字典,数组嵌套使用