pytorch中tf.nn.functional.softmax(x,dim = -1)对参数dim的理解

  • Post author:
  • Post category:其他




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

的公式为:





S

o

f

t

m

a

x

(

x

i

)

=

e

x

p

(

x

i

)

j

x

i

Softmax(x_i)=\frac{exp(x_i)}{\sum_{j}x_i}






S


o


f


t


m


a


x


(



x










i


















)




=
































j






















x










i






























e


x


p


(



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=-1



dim=2

的结果是一样的。

其实这些结果,拿个计算器,自己算都行,可以加深对公式的印象:



input

数值第一维第一行为例:


[-3.9332, 0.7909, 0.8927]

怎么求得上面的结果

[0.0042, 0.4726, 0.5232]





S

o

f

t

m

a

x

(

x

1

)

=

e

x

p

(

x

1

)

j

x

i

=

e

x

p

(

3.9332

)

e

x

p

(

3.9332

)

+

e

x

p

(

0.7909

)

+

e

x

p

(

0.8927

)

=

0.0041959

Softmax(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






S


o


f


t


m


a


x


(



x










1


















)




=

































j






















x










i
































e


x


p


(



x










1


















)























=




















e


x


p


(





3


.


9


3


3


2


)


+


e


x


p


(


0


.


7


9


0


9


)


+


e


x


p


(


0


.


8


9


2


7


)
















e


x


p


(





3


.


9


3


3


2


)























=








0


.


0


0


4


1


9


5


9









S

o

f

t

m

a

x

(

x

2

)

=

e

x

p

(

x

2

)

j

x

i

=

e

x

p

(

0.7909

)

e

x

p

(

3.9332

)

+

e

x

p

(

0.7909

)

+

e

x

p

(

0.8927

)

=

0.4725807

Softmax(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






S


o


f


t


m


a


x


(



x










2


















)




=

































j






















x










i
































e


x


p


(



x










2


















)























=




















e


x


p


(





3


.


9


3


3


2


)


+


e


x


p


(


0


.


7


9


0


9


)


+


e


x


p


(


0


.


8


9


2


7


)
















e


x


p


(


0


.


7


9


0


9


)























=








0


.


4


7


2


5


8


0


7









S

o

f

t

m

a

x

(

x

3

)

=

e

x

p

(

x

3

)

j

x

i

=

e

x

p

(

0.8927

)

e

x

p

(

3.9332

)

+

e

x

p

(

0.7909

)

+

e

x

p

(

0.8927

)

=

0.5232234

Softmax(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






S


o


f


t


m


a


x


(



x










3


















)




=

































j






















x










i
































e


x


p


(



x










3


















)























=




















e


x


p


(





3


.


9


3


3


2


)


+


e


x


p


(


0


.


7


9


0


9


)


+


e


x


p


(


0


.


8


9


2


7


)
















e


x


p


(


0


.


8


9


2


7


)























=








0


.


5


2


3


2


2


3


4





总结:


用一张图片会更好理解这个参数数值变化代表的意思:

softmax



版权声明:本文为Will_Ye原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。