pytorch中tf.nn.functional.softmax(x,dim = -1)對參數dim的理解

torch.nn.functional.Softmax(input,dim=None)

tf.nn.functional.softmax(x,dim = -1)中的參數dim是指維度的意思,設置這個參數時會遇到0,1,2,-1等情況,特別是對2和-1不熟悉,細究了一下這個問題
查了一下API手冊,是指最後一行的意思。原文:
dim (python:int) – A dimension along which Softmax will be computed (so every slice along dim will sum to 1).

softmax的公式爲:
Softmax(xi)=exp(xi)jxiSoftmax(x_i)=\frac{exp(x_i)}{\sum_{j}x_i}

一般會有設置成dim=0,1,2,-1的情況

準備工作:先隨機生成一個(2,2,3)的矩陣,兩個維度的(2,3)矩陣。

import torch
import torch.nn.functional as F
input = torch.randn(2,2,3))
print(input)

輸出爲:

tensor([[[-3.9332,  0.7909,  0.8927],
         [-1.7991,  0.2505,  0.7695]],

        [[ 0.1946,  0.1878,  1.2713],
         [ 0.9536,  1.0525, -0.7081]]])
  • 要注意的是當dim=0時, 是對每一維度相同位置的數值進行softmax運算,舉個栗子:
m = F.softmax(input,dim=0)
print(m)

輸出爲:

tensor([[[0.0159, 0.6464, 0.4065],
         [0.0599, 0.3096, 0.8142]],

        [[0.9841, 0.3536, 0.5935],
         [0.9401, 0.6904, 0.1858]]])

從輸出結果可以看出,一共2個維度
每一個維度(2,3)對應的數值相加爲1,例如:

[0][0][0]+[1][0][0]=0.0159+0.9841=1
[0][0][1]+[1][0][1]=0.6464+0.3536=1

  • 要注意的是當dim=1時, 是對某一維度的列進行softmax運算:
m = F.softmax(input,dim=1)
print(m)

輸出爲:

tensor([[[0.1058, 0.6319, 0.5308],
         [0.8942, 0.3681, 0.4692]],

        [[0.3189, 0.2964, 0.8786],
         [0.6811, 0.7036, 0.1214]]])

從輸出結果可以看出,計算的是某一維度中的列,例如:
在第1維度中:
[0][0][0]+[0][1][0]=0.1058+0.8942=1
在第2維度中:
[1][0][0]+[1][1][0]=0.3189+0.6811=1

  • 要注意的是當dim=2時, 是對某一維度的行進行softmax運算:
m = F.softmax(input,dim=2)
print(m)

輸出爲:

tensor([[[0.0042, 0.4726, 0.5232],
         [0.0458, 0.3560, 0.5982]],

        [[0.2029, 0.2015, 0.5955],
         [0.4360, 0.4813, 0.0828]]])

從輸出結果可以看出,計算的是某一維度中的行,例如:
在第1維度中:
[0][0][0]+[0][0][1]+[0][0][2]=0.0042+0.4726+0.5232=1
在第2維度中:
[1][0][0]+[1][0][1]+[1][0][2]=0.2029+0.2015+0.5955=0.9999=1(是等於1的,只是後面還有很多位小數省略了)

  • 要注意的是當dim=-1時, 是對某一維度的行進行softmax運算:
m = F.softmax(input,dim=-1)
print(m)

輸出爲:

tensor([[[0.0042, 0.4726, 0.5232],
         [0.0458, 0.3560, 0.5982]],

        [[0.2029, 0.2015, 0.5955],
         [0.4360, 0.4813, 0.0828]]])

從這裏可以發現,dim=-1dim=2的結果是一樣的。
其實這些結果,拿個計算器,自己算都行,可以加深對公式的印象:
input數值第一維第一行爲例:
[-3.9332, 0.7909, 0.8927]怎麼求得上面的結果[0.0042, 0.4726, 0.5232]
Softmax(x1)=exp(x1)jxi=exp(3.9332)exp(3.9332)+exp(0.7909)+exp(0.8927)=0.0041959Softmax(x_1)=\frac{exp(x_1)}{\sum_{j}x_i}=\frac{exp(-3.9332)}{exp(-3.9332)+exp(0.7909)+exp(0.8927)}=0.0041959
Softmax(x2)=exp(x2)jxi=exp(0.7909)exp(3.9332)+exp(0.7909)+exp(0.8927)=0.4725807Softmax(x_2)=\frac{exp(x_2)}{\sum_{j}x_i}=\frac{exp(0.7909)}{exp(-3.9332)+exp(0.7909)+exp(0.8927)}=0.4725807
Softmax(x3)=exp(x3)jxi=exp(0.8927)exp(3.9332)+exp(0.7909)+exp(0.8927)=0.5232234Softmax(x_3)=\frac{exp(x_3)}{\sum_{j}x_i}=\frac{exp(0.8927)}{exp(-3.9332)+exp(0.7909)+exp(0.8927)}=0.5232234

總結:
用一張圖片會更好理解這個參數數值變化代表的意思:
softmax

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章