從F.softmax(dim)出發看維度dim的選擇
1.dim
數學定義:
– 二維矩陣
當矩陣x
是二維的時候(這個大家都懂,行列去理解)
dim=0
,代表在dim=0
維上的概率分佈
j
是個固定值,是常數;N
的值來自len(x[:,j])-1
,也就是一共多少行減1;
代碼表現方式:
sum(x[:,j]) = 1 → Tensor
dim=1
代表在dim=1
維上的概率分佈:
j
是個固定值,是常數;N
的值來自len(x[j,:])-1
,也就是一共多少列;
代碼表現方式:
sum(x[j,:]) = 1 → Tensor
– 三維矩陣
當矩陣x
是三維的時候(大家普遍困惑d的)大家關注i
的位置就行
dim=0
代表在dim=0
維上的概率分佈:
j,k
是個固定值,是常數;N
的值來自len(x[:,j,k])-1
;dim=1
代表在dim=1
維上的概率分佈:
j,k
是個固定值,是常數;N
的值來自len(x[j,:,k])-1
;dim=2
代表在dim=2
維上的概率分佈:
j,k
是個固定值,是常數;N
的值來自len(x[j,k,:])-1
;
2.舉例
又到了大家最愛的舉例環節
二維矩陣X
準備數據
x = torch.tensor([[2,3,4],[1,3,2]],dtype=torch.float32)
'''構建的數據
tensor([[2., 3., 4.],
[1., 3., 2.]])'''
dim=0
x_soft = F.softmax(x,dim=0)
# outputs
tensor([[0.7311, 0.5000, 0.8808],
[0.2689, 0.5000, 0.1192]])
↑ ↑ ↑
'注意箭頭,和爲1'
你會發現:
(1) . x_soft[0,0] + x_soft[1,0] = 1 --→ sum(x_soft[:,0])=1
(2) . x_soft[0,1] + x_soft[1,1] = 1 --→ sum(x_soft[:,0])=1
(3) . x_soft[0,2] + x_soft[1,2] = 1 --→ sum(x_soft[:,0])=1
代碼如下
In [1]: sum(x_soft[:, 0])
Oot[1]: tensor(1.) # 輸出爲1
In [2]: sum(x_soft[:, 1])
Oot[2]: tensor(1.) # 輸出爲1
In [3]: sum(x_soft[:, 2])
Oot[3]: tensor(1.) # 輸出爲1
dim=1
x_soft = F.softmax(x,dim=1)
# outputs
tensor([[0.0900, 0.2447, 0.6652], ← ←
[0.0900, 0.6652, 0.2447]]) ← ←
'注意箭頭和爲1'
你會發現:
(1) . x[0,0] + x[0,1] + x[0,2] = 1 --→ sum(x_soft[:,0])=1
(2) . x[1,0] + x[1,1] + x[1,2] = 1 --→ sum(x_soft[:,0])=1
代碼如下
In [1]: sum(x_soft[:, 0])
Oot[1]: tensor(1.) # 輸出爲1
In [2]: sum(x_soft[:, 1])
Oot[2]: tensor(1.) # 輸出爲1
三維矩陣
準備數據
y = torch.tensor([[[1,2,1,2],[2,3,2,1],[1,2,3,4]],[[2,3,2,5],[3,4,6,1],[1,8,3,2]]], dtype=torch.float32)
'''構建的數據
tensor([[[1., 2., 1., 2.],
[2., 3., 2., 1.],
[1., 2., 3., 4.]],
[[2., 3., 2., 5.],
[3., 4., 6., 1.],
[1., 8., 3., 2.]]])'''
dim=0
,是在dim=0
維上的概率分佈,如 y[0][2][3]+y[1][2][3]=1
y_soft = F.softmax(y, dim=0)
# outputs
tensor([[[0.2689, 0.2689, 0.2689, 0.0474],
↓ [示例]
[0.2689, → 0.2689 ←, 0.0180, 0.5000],
↑
[0.5000, 0.0025, 0.5000, 0.8808]],
[[0.7311, 0.7311, 0.7311, 0.9526],
↓ [示例]
[0.7311, → 0.7311 ←, 0.9820, 0.5000],
↑
[0.5000, 0.9975, 0.5000, 0.1192]]])
你會發現:
(1) . y_soft[0,0,0] + y_soft[1,0,0] = 1 --→ sum(y_soft[:,0,0])=1
…
(n) . y_soft[0,1,2] + y_soft[1,1,2] = 1 --→ sum(y_soft[:,1,1])=1
…
(24) y_soft[0,3,3] + y_soft[1,3,3] =1 --→ sum(y_soft[:,3,3])=1
代碼不寫了,有興趣的可以寫寫
dim=1
,是在dim=1
維上的概率分佈,如 y[1][0][3]+y[1][1][3]+y[2][2][3]=1
y_soft = F.softmax(y, dim=1)
# outputs
tensor([[[0.2119, 0.2119, 0.0900, 0.1142],
[0.5761, 0.5761, 0.2447, 0.0420],
[0.2119, 0.2119, 0.6652, 0.8438]],
↓ [示例]
[[0.2447, 0.0066, → 0.0171 ←, 0.9362],
[0.6652, 0.0179, → 0.9362 ←, 0.0171],
[0.0900, 0.9756, → 0.0466 ←, 0.0466]]])
↑
你會發現:
(1). y_soft[0,0,0] + y_soft[0,1,0] + y_soft[0,2,0] = 1 --→ sum(y_soft[0,:,0])=1
…
(n). y_soft[1,0,0] + y_soft[1,1,0] + y_soft[1,2,0] = 1 --→ sum(y_soft[1,:,1])=1
…
(n). y_soft[2,0,2] + y_soft[2,1,2] + y_soft[2,2,2] = 1 --→ sum(y_soft[1,:,1])=1
代碼不寫了,有興趣的可以寫寫
dim=2
,是在dim=2
維上的概率分佈,如 y[1][4][0]+y[1][4][1]+y[1][4][2]+y[1][4][3]=1
同理,可以自己寫寫看。