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
的公式为:
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}
Softmax(xi)=∑jxiexp(xi)
一般会有设置成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
Softmax(x1)=∑jxiexp(x1)=exp(−3.9332)+exp(0.7909)+exp(0.8927)exp(−3.9332)=0.0041959
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
Softmax(x2)=∑jxiexp(x2)=exp(−3.9332)+exp(0.7909)+exp(0.8927)exp(0.7909)=0.4725807
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
Softmax(x3)=∑jxiexp(x3)=exp(−3.9332)+exp(0.7909)+exp(0.8927)exp(0.8927)=0.5232234
总结:
用一张图片会更好理解这个参数数值变化代表的意思:
更多推荐
所有评论(0)