淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋
在利用torch.max函數(shù)和F.Ssoftmax函數(shù)時(shí),對(duì)應(yīng)該設(shè)置什么維度,總是有點(diǎn)懵,遂總結(jié)一下:
首先看看二維tensor的函數(shù)的例子:
import torch
import torch.nn.functional as F
input = torch.randn(3,4)
print(input)
tensor([[-0.5526, -0.0194, 2.1469, -0.2567],
[-0.3337, -0.9229, 0.0376, -0.0801],
[ 1.4721, 0.1181, -2.6214, 1.7721]])
b = F.softmax(input,dim=0) # 按列SoftMax,列和為1
print(b)
tensor([[0.1018, 0.3918, 0.8851, 0.1021],
[0.1268, 0.1587, 0.1074, 0.1218],
[0.7714, 0.4495, 0.0075, 0.7762]])
c = F.softmax(input,dim=1) # 按行SoftMax,行和為1
print(c)
tensor([[0.0529, 0.0901, 0.7860, 0.0710],
[0.2329, 0.1292, 0.3377, 0.3002],
[0.3810, 0.0984, 0.0064, 0.5143]])
d = torch.max(input,dim=0) # 按列取max,
print(d)
torch.return_types.max(
values=tensor([1.4721, 0.1181, 2.1469, 1.7721]),
indices=tensor([2, 2, 0, 2]))
e = torch.max(input,dim=1) # 按行取max,
print(e)
torch.return_types.max(
values=tensor([2.1469, 0.0376, 1.7721]),
indices=tensor([2, 2, 3]))
下面看看三維tensor解釋例子:
函數(shù)softmax輸出的是所給矩陣的概率分布;
b輸出的是在dim=0維上的概率分布,b[0][5][6]+b[1][5][6]+b[2][5][6]=1
a=torch.rand(3,16,20)
b=F.softmax(a,dim=0)
c=F.softmax(a,dim=1)
d=F.softmax(a,dim=2)
In [1]: import torch as t
In [2]: import torch.nn.functional as F
In [4]: a=t.Tensor(3,4,5)
In [5]: b=F.softmax(a,dim=0)
In [6]: c=F.softmax(a,dim=1)
In [7]: d=F.softmax(a,dim=2)
In [8]: a
Out[8]:
tensor([[[-0.1581, 0.0000, 0.0000, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000],
[-0.0344, 0.0000, -0.0344, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000]],
[[-0.0344, 0.0000, -0.0344, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000],
[-0.0344, 0.0000, -0.0344, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000]],
[[-0.0344, 0.0000, -0.0344, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000],
[-0.0344, 0.0000, -0.0344, 0.0000, -0.0344],
[ 0.0000, -0.0344, 0.0000, -0.0344, 0.0000]]])
In [9]: b
Out[9]:
tensor([[[0.3064, 0.3333, 0.3410, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333]],
[[0.3468, 0.3333, 0.3295, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333]],
[[0.3468, 0.3333, 0.3295, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333],
[0.3333, 0.3333, 0.3333, 0.3333, 0.3333]]])
In [10]: b.sum()
Out[10]: tensor(20.0000)
In [11]: b[0][0][0]+b[1][0][0]+b[2][0][0]
Out[11]: tensor(1.0000)
In [12]: c.sum()
Out[12]: tensor(15.)
In [13]: c
Out[13]:
tensor([[[0.2235, 0.2543, 0.2521, 0.2543, 0.2457],
[0.2618, 0.2457, 0.2521, 0.2457, 0.2543],
[0.2529, 0.2543, 0.2436, 0.2543, 0.2457],
[0.2618, 0.2457, 0.2521, 0.2457, 0.2543]],
[[0.2457, 0.2543, 0.2457, 0.2543, 0.2457],
[0.2543, 0.2457, 0.2543, 0.2457, 0.2543],
[0.2457, 0.2543, 0.2457, 0.2543, 0.2457],
[0.2543, 0.2457, 0.2543, 0.2457, 0.2543]],
[[0.2457, 0.2543, 0.2457, 0.2543, 0.2457],
[0.2543, 0.2457, 0.2543, 0.2457, 0.2543],
[0.2457, 0.2543, 0.2457, 0.2543, 0.2457],
[0.2543, 0.2457, 0.2543, 0.2457, 0.2543]]])
In [14]: n=t.rand(3,4)
In [15]: n
Out[15]:
tensor([[0.2769, 0.3475, 0.8914, 0.6845],
[0.9251, 0.3976, 0.8690, 0.4510],
[0.8249, 0.1157, 0.3075, 0.3799]])
In [16]: m=t.argmax(n,dim=0)
In [17]: m
Out[17]: tensor([1, 1, 0, 0])
In [18]: p=t.argmax(n,dim=1)
In [19]: p
Out[19]: tensor([2, 0, 0])
In [20]: d.sum()
Out[20]: tensor(12.0000)
In [22]: d
Out[22]:
tensor([[[0.1771, 0.2075, 0.2075, 0.2075, 0.2005],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027],
[0.1972, 0.2041, 0.1972, 0.2041, 0.1972],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027]],
[[0.1972, 0.2041, 0.1972, 0.2041, 0.1972],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027],
[0.1972, 0.2041, 0.1972, 0.2041, 0.1972],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027]],
[[0.1972, 0.2041, 0.1972, 0.2041, 0.1972],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027],
[0.1972, 0.2041, 0.1972, 0.2041, 0.1972],
[0.2027, 0.1959, 0.2027, 0.1959, 0.2027]]])
In [23]: d[0][0].sum()
Out[23]: tensor(1.)
補(bǔ)充知識(shí):多分類問題torch.nn.Softmax的使用
為什么談?wù)撨@個(gè)問題呢?是因?yàn)槲以诠ぷ鞯倪^程中遇到了語義分割預(yù)測(cè)輸出特征圖個(gè)數(shù)為16,也就是所謂的16分類問題。
因?yàn)槊總€(gè)通道的像素的值的大小代表了像素屬于該通道的類的大小,為了在一張圖上用不同的顏色顯示出來,我不得不學(xué)習(xí)了torch.nn.Softmax的使用。
首先看一個(gè)簡(jiǎn)答的例子,倘若輸出為(3, 4, 4),也就是3張4x4的特征圖。
import torch img = torch.rand((3,4,4)) print(img)
輸出為:
tensor([[[0.0413, 0.8728, 0.8926, 0.0693],
[0.4072, 0.0302, 0.9248, 0.6676],
[0.4699, 0.9197, 0.3333, 0.4809],
[0.3877, 0.7673, 0.6132, 0.5203]],
[[0.4940, 0.7996, 0.5513, 0.8016],
[0.1157, 0.8323, 0.9944, 0.2127],
[0.3055, 0.4343, 0.8123, 0.3184],
[0.8246, 0.6731, 0.3229, 0.1730]],
[[0.0661, 0.1905, 0.4490, 0.7484],
[0.4013, 0.1468, 0.2145, 0.8838],
[0.0083, 0.5029, 0.0141, 0.8998],
[0.8673, 0.2308, 0.8808, 0.0532]]])
我們可以看到共三張?zhí)卣鲌D,每張?zhí)卣鲌D上對(duì)應(yīng)的值越大,說明屬于該特征圖對(duì)應(yīng)類的概率越大。
import torch.nn as nn sogtmax = nn.Softmax(dim=0) img = sogtmax(img) print(img)
輸出為:
tensor([[[0.2780, 0.4107, 0.4251, 0.1979],
[0.3648, 0.2297, 0.3901, 0.3477],
[0.4035, 0.4396, 0.2993, 0.2967],
[0.2402, 0.4008, 0.3273, 0.4285]],
[[0.4371, 0.3817, 0.3022, 0.4117],
[0.2726, 0.5122, 0.4182, 0.2206],
[0.3423, 0.2706, 0.4832, 0.2522],
[0.3718, 0.3648, 0.2449, 0.3028]],
[[0.2849, 0.2076, 0.2728, 0.3904],
[0.3627, 0.2581, 0.1917, 0.4317],
[0.2543, 0.2898, 0.2175, 0.4511],
[0.3880, 0.2344, 0.4278, 0.2686]]])
可以看到,上面的代碼對(duì)每張?zhí)卣鲌D對(duì)應(yīng)位置的像素值進(jìn)行Softmax函數(shù)處理, 圖中標(biāo)紅位置加和=1,同理,標(biāo)藍(lán)位置加和=1。
我們看到Softmax函數(shù)會(huì)對(duì)原特征圖每個(gè)像素的值在對(duì)應(yīng)維度(這里dim=0,也就是第一維)上進(jìn)行計(jì)算,將其處理到0~1之間,并且大小固定不變。
print(torch.max(img,0))
輸出為:
torch.return_types.max(
values=tensor([[0.4371, 0.4107, 0.4251, 0.4117],
[0.3648, 0.5122, 0.4182, 0.4317],
[0.4035, 0.4396, 0.4832, 0.4511],
[0.3880, 0.4008, 0.4278, 0.4285]]),
indices=tensor([[1, 0, 0, 1],
[0, 1, 1, 2],
[0, 0, 1, 2],
[2, 0, 2, 0]]))
可以看到這里3x4x4變成了1x4x4,而且對(duì)應(yīng)位置上的值為像素對(duì)應(yīng)每個(gè)通道上的最大值,并且indices是對(duì)應(yīng)的分類。
清楚理解了上面的流程,那么我們就容易處理了。
看具體案例,這里輸出output的大小為:16x416x416.
output = torch.tensor(output)
sm = nn.Softmax(dim=0)
output = sm(output)
mask = torch.max(output,0).indices.numpy()
# 因?yàn)橐D(zhuǎn)化為RGB彩色圖,所以增加一維
rgb_img = np.zeros((output.shape[1], output.shape[2], 3))
for i in range(len(mask)):
for j in range(len(mask[0])):
if mask[i][j] == 0:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 255
rgb_img[i][j][2] = 255
if mask[i][j] == 1:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 180
rgb_img[i][j][2] = 0
if mask[i][j] == 2:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 180
rgb_img[i][j][2] = 180
if mask[i][j] == 3:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 180
rgb_img[i][j][2] = 255
if mask[i][j] == 4:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 255
rgb_img[i][j][2] = 180
if mask[i][j] == 5:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 255
rgb_img[i][j][2] = 0
if mask[i][j] == 6:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 180
if mask[i][j] == 7:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 255
if mask[i][j] == 8:
rgb_img[i][j][0] = 255
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 0
if mask[i][j] == 9:
rgb_img[i][j][0] = 180
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 0
if mask[i][j] == 10:
rgb_img[i][j][0] = 180
rgb_img[i][j][1] = 255
rgb_img[i][j][2] = 255
if mask[i][j] == 11:
rgb_img[i][j][0] = 180
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 180
if mask[i][j] == 12:
rgb_img[i][j][0] = 180
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 255
if mask[i][j] == 13:
rgb_img[i][j][0] = 180
rgb_img[i][j][1] = 255
rgb_img[i][j][2] = 180
if mask[i][j] == 14:
rgb_img[i][j][0] = 0
rgb_img[i][j][1] = 180
rgb_img[i][j][2] = 255
if mask[i][j] == 15:
rgb_img[i][j][0] = 0
rgb_img[i][j][1] = 0
rgb_img[i][j][2] = 0
cv2.imwrite('output.jpg', rgb_img)
最后保存得到的圖為:

以上這篇淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用matplotlib簡(jiǎn)單繪圖示例
這篇文章主要介紹了Python使用matplotlib簡(jiǎn)單繪圖,結(jié)合實(shí)例形式分析了Python基于matplotlib繪制正弦與余弦曲線相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
Python報(bào)錯(cuò)AssertionError:can only test a c
這篇文章主要介紹了Python報(bào)錯(cuò)AssertionError:can only test a child proc問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Python實(shí)現(xiàn)匯率轉(zhuǎn)換操作
這篇文章主要介紹了Python實(shí)現(xiàn)匯率轉(zhuǎn)換操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
python安裝庫(kù)的最詳細(xì)方法(以安裝pygame庫(kù)為例)
在學(xué)習(xí)了一個(gè)學(xué)期的python之后,我決定對(duì)pygame下手了,下面這篇文章主要給大家介紹了關(guān)于python安裝庫(kù)的最詳細(xì)方法,本文主要以安裝pygame庫(kù)為例,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人
這篇文章主要介紹了Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人,下文圍繞利用Python?實(shí)現(xiàn)驅(qū)動(dòng)AI機(jī)器人的相關(guān)資料展開內(nèi)容,需要的小伙伴可以參考一下2022-02-02
pandas 對(duì)每一列數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化的方法
今天小編就為大家分享一篇pandas 對(duì)每一列數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06
PyCharm Python Console中文輸出亂碼問題及解決
這篇文章主要介紹了PyCharm Python Console中文輸出亂碼問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
Python基于PyGraphics包實(shí)現(xiàn)圖片截取功能的方法
這篇文章主要介紹了Python基于PyGraphics包實(shí)現(xiàn)圖片截取功能的方法,涉及PyGraphics包的安裝及基于PyGraphics包實(shí)現(xiàn)圖片的打開、讀取、截取等相關(guān)操作技巧,需要的朋友可以參考下2017-12-12

