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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nn.KLDivLoss

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

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