Pytorch中關于F.normalize計算理解
關于F.normalize計算理解
動機
最近多次看到該方法出現(xiàn),于是準備了解一下,搜了后發(fā)現(xiàn)原來是所謂的L2 norm計算
簡介
函數(shù)定義
torch.nn.functional.normalize(input,?p=2.0,?dim=1,?eps=1e-12,?out=None)
功能:將某一個維度除以那個維度對應的范數(shù)(默認是2范數(shù))。
使用:
F.normalize(data, p=2/1, dim=0/1/-1) 將某一個維度除以那個維度對應的范數(shù)(默認是2范數(shù))
data
:輸入的數(shù)據(jù)(tensor)p
:L2/L1_norm運算dim
:0表示按列操作,則每列都是除以該列下平方和的開方;1表示按行操作,則每行都是除以該行下所有元素平方和的開方
舉例
最后dim=0,是1/根號下1平方+1平方,2/根號下2平方+2平方,3/根號下3平方+3平方,所以都是0.7071
Pytorch中normalize應用
torch.nn.functional.normalize(input, p=2, dim=1, eps=1e-12, out=None)
其中,p表示范數(shù)(這里是2范數(shù)),dim表示計算范數(shù)的維度(默認為1),eps是為了防止分母為0;
pytorch中的normalize函數(shù)本質(zhì)上就是針對某個維度進行歸一化,公式為:
方便記憶,二維矩陣中, dim=1表示在行內(nèi)進行歸一化,dim=0表示在列內(nèi)進行歸一化。
在使用過程中,對dim的理解不夠到位,來三個代碼實驗一下。
示例1:dim=1
a = F.softmax(torch.randn((1, 3, 4)), 1) b = F.normalize(a)
輸出:
// a
tensor([[[0.2621, 0.2830, 0.3758, 0.0260],
[0.3634, 0.3750, 0.5382, 0.1085],
[0.3744, 0.3420, 0.0860, 0.8655]]])
// b
b: tensor([[[0.4489, 0.4870, 0.5676, 0.0298],
[0.6224, 0.6454, 0.8130, 0.1243],
[0.6412, 0.5885, 0.1299, 0.9918]]])
代碼中針對維度1進行歸一化。維度1有3個通道,具體的計算細節(jié)為
示例2:dim=2
a = F.softmax(torch.randn((1, 3, 4)), 1) c = F.normalize(b, dim=2)
// a tensor([[[0.0861, 0.1087, 0.0518, 0.3551], ? ? ? ? ?[0.8067, 0.4128, 0.0592, 0.2884], ? ? ? ? ?[0.1072, 0.4785, 0.8890, 0.3565]]]) // c tensor([[[0.2237, 0.2825, 0.1347, 0.9230], ? ? ? ? ?[0.8467, 0.4332, 0.0621, 0.3027], ? ? ? ? ?[0.0997, 0.4447, 0.8262, 0.3313]]])
這里作用的是維度2,可以認為維度2有4個通道,計算細節(jié)為:
示例3:dim=0
a = F.softmax(torch.randn((1, 3, 4)), 1) c = F.normalize(b, dim=0)
// a tensor([[[0.0861, 0.1087, 0.0518, 0.3551], ? ? ? ? ?[0.8067, 0.4128, 0.0592, 0.2884], ? ? ? ? ?[0.1072, 0.4785, 0.8890, 0.3565]]]) // c tensor([[[1., 1., 1., 1.], ? ? ? ? ?[1., 1., 1., 1.], ? ? ? ? ?[1., 1., 1., 1.]]])
這里作用的是維度0;維度0上只有1個通道,因此歸一化之后全為1,即
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python?使用ctypes調(diào)用C/C++?dll詳情
這篇文章主要介紹了python?使用ctypes調(diào)用C/C++?dll詳情,文章首先通過導入ctypes模塊,加載C/C++?dll到python進程空間展開主題相關內(nèi)容,需要的小伙伴可以參考一下2022-04-04Python數(shù)據(jù)分析模塊pandas用法詳解
這篇文章主要介紹了Python數(shù)據(jù)分析模塊pandas用法,結合實例形式詳細分析了Python數(shù)據(jù)分析模塊pandas的功能、常見用法及相關操作注意事項,需要的朋友可以參考下2019-09-09Python中查看變量的類型內(nèi)存地址所占字節(jié)的大小
這篇文章主要介紹了Python中查看變量的類型,內(nèi)存地址,所占字節(jié)的大小,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06使用__init__.py將文件夾設置成Python模塊示例詳解
這篇文章主要為大家介紹了使用__init__.py將文件夾設置成Python模塊示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09Python在Matplotlib圖中顯示中文字體的操作方法
這篇文章主要介紹了Python在Matplotlib圖中顯示中文字體的方法,本篇主要針對在Ubuntu系統(tǒng)中,matplotlib顯示不了中文的問題,尤其是在無法安裝系統(tǒng)字體的情況下,解決Python繪圖時中文顯示的問題。需要的朋友可以參考下2019-07-07Python數(shù)據(jù)結構與算法之完全樹與最小堆實例
這篇文章主要介紹了Python數(shù)據(jù)結構與算法之完全樹與最小堆,結合實例形式分析了Python完全樹定義及堆排序功能實現(xiàn)相關操作技巧,需要的朋友可以參考下2017-12-12Python的GUI編程之Pack、Place、Grid的區(qū)別說明
這篇文章主要介紹了Python的GUI編程之Pack、Place、Grid的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06