从F.softmax(dim)出发看维度dim的选择
1.dim 数学定义:
– 二维矩阵
当矩阵
dim=0 代表:
i=0∑N?x[i,j]=1
j 是个固定值,是常数;N 的值来自len(x[:,j])-1 ,也就是一共多少行减1;
代码表现方式:
1 | sum(x[:,j]) = 1 → Tensor |
dim=1 代表:
i=0∑N?x[j,i]=1
j 是个固定值,是常数;N 的值来自len(x[j,:])-1 ,也就是一共多少列;
代码表现方式:
1 | sum(x[j,:]) = 1 → Tensor |
– 三维矩阵
当矩阵
dim=0 代表:
i=0∑N?x[i,j,k]=1
j,k 是个固定值,是常数;N 的值来自len(x[:,j,k])-1 ;dim=1 代表:
i=0∑N?x[j,i,k]=1
j,k 是个固定值,是常数;N 的值来自len(x[j,:,k])-1 ;dim=2 代表:
i=0∑N?x[j,k,i]=1
j,k 是个固定值,是常数;N 的值来自len(x[j,k,:])-1 ;
2.举例
又到了大家最爱的举例环节
二维矩阵X
准备数据
1 2 3 4 | x = torch.tensor([[2,3,4],[1,3,2]],dtype=torch.float32) '''构建的数据 tensor([[2., 3., 4.], [1., 3., 2.]])''' |
dim=0
1 2 3 4 5 6 | 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 --→
(2) . x_soft[0,1] + x_soft[1,1] = 1 --→
(3) . x_soft[0,2] + x_soft[1,2] = 1 --→
代码如下
1 2 3 4 5 6 7 8 | 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
1 2 3 4 5 | 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 --→
(2) . x[1,0] + x[1,1] + x[1,2] = 1 --→
代码如下
1 2 3 4 5 | In [1]: sum(x_soft[:, 0]) Oot[1]: tensor(1.) # 输出为1 In [2]: sum(x_soft[:, 1]) Oot[2]: tensor(1.) # 输出为1 |
三维矩阵
准备数据
1 2 3 4 5 6 7 8 9 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 --→
…
(n) . y_soft[0,1,2] + y_soft[1,1,2] = 1 --→
…
(24) y_soft[0,3,3] + y_soft[1,3,3] =1 --→
代码不写了,有兴趣的可以写写
dim=1
1 2 3 4 5 6 7 8 9 10 | 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 --→
…
(n). y_soft[1,0,0] + y_soft[1,1,0] + y_soft[1,2,0] = 1 --→
…
(n). y_soft[2,0,2] + y_soft[2,1,2] + y_soft[2,2,2] = 1 --→
代码不写了,有兴趣的可以写写
dim=2
同理,可以自己写写看。