Pytorch nn.Softmax(dim=?) 详解

 本文参考自:Pytorch nn.Softmax(dim=?) - 知乎

原文写得很好了,我这边另外完善了一些细节,让大家理解地更加直白一些。

可以先去看上面的参考文章,也可以直接看我这篇。 

目录

1、tensor1

1)已知该矩阵的维度为(2,2,2,3),我们可以用(d0,d1,d2,d3)来表示(2,2,2,3)。

2)当dim=0时

3)当dim=1时

4)当dim=2时

5)当dim=3时

2、tensor2

1)已知该tensor的维度为(3,3),那么d0=3,d1=3。

2) dim=0时

3)dim=1时


1、tensor1

a = np.asarray([[[[1,1,1],[2,2,2]],
                [[3,3,3],[4,10,10]]],

                [[[1,1,1], [2,2,2]],
                 [[3,3,3], [4,10,10]]]
                ],np.float32)
print(a.shape)  #(2, 2, 2, 3)

1)已知该矩阵的维度为(2,2,2,3),我们可以用(d0,d1,d2,d3)来表示(2,2,2,3)。

接下来分情况讨论以下运算:

input = torch.from_numpy(a)

m0 = nn.Softmax(dim=0)  # dim=0的情况
output0 = m0(input)
print("output0: ",output0)

m1 = nn.Softmax(dim=1)  # dim=1的情况
output1 = m1(input)
print("output1: ",output1)

m2 = nn.Softmax(dim=2)  # dim=2的情况
output2 = m2(input)
print("output2: ",output2)

m3 = nn.Softmax(dim=3)  # dim=3的情况
output3 = m3(input)
print("output3: ",output3)

2)当dim=0时

我们将整个矩阵划分为d0=2份。每一份里面对应位置的d0=2个数进行softmax运算。

Pytorch nn.Softmax(dim=?) 详解_第1张图片Pytorch nn.Softmax(dim=?) 详解_第2张图片以此类推。

softmax函数的输出不改变原数据维度的大小,最后得到的是

Pytorch nn.Softmax(dim=?) 详解_第3张图片

3)当dim=1时

我们将整个矩阵划分为d0=2份(红色框)的基础上,再在这2个区域内分别划分出的d1=2个区域(黄色框),在更小的区域之间的d1=2个数之间进行softmax运算。

 Pytorch nn.Softmax(dim=?) 详解_第4张图片Pytorch nn.Softmax(dim=?) 详解_第5张图片

4)当dim=2时

我们将整个矩阵划分为d0=2份(红色框)的基础上,再在小区域内分别划分出的d1=2个区域(黄色框),再在更小的区域内划分出d2=2个区域(蓝色框),之后在相邻的最小区域(蓝色框)之间的d2=2个数之间进行softmax运算。

Pytorch nn.Softmax(dim=?) 详解_第6张图片Pytorch nn.Softmax(dim=?) 详解_第7张图片

5)当dim=3时

我们将整个矩阵划分为d0=2份(红色框)的基础上,再在小区域内分别划分出的d1=2个区域(黄色框),再在更小的区域内划分出d2=2个区域(蓝色框),最后再划分出d3=3个最小区域(绿色框),区域之间的d3=3个数之间进行softmax运算。(简单说就是相邻3个绿色框内的数进行softmax运算)

Pytorch nn.Softmax(dim=?) 详解_第8张图片Pytorch nn.Softmax(dim=?) 详解_第9张图片

 有了这个d0,d1,d2,d3...的维度说明之后,我们可以去理解任意一个tensor的Softmax运算,万变不离其宗。

2、tensor2

这里再举一个简单的例子:

x = torch.tensor([[0.7459, 0.5881, 0.4795],
                  [0.2894, 0.0568, 0.3439],
                  [0.6124, 0.7558, 0.4308]])
x_softmax = nn.Softmax(dim=0)(x)  # 每列算
print(x_softmax)
x_softmax2 = nn.Softmax(dim=1)(x)  # 每行算
print(x_softmax2)

1)已知该tensor的维度为(3,3),那么d0=3,d1=3。

2) dim=0时

将tensor分为d0=3个区域,相邻区域间的d0=3个数进行softmax运算。

Pytorch nn.Softmax(dim=?) 详解_第10张图片

 也就是按列运算,最后的结果可以计算每一列的总和验证下。

3)dim=1时

将tensor分为d0=3个区域,在小区域内再划分d1=3个区域,相邻的最小区域之间的d1=3个数进行softmax运算。(即各个相邻的3个蓝色框内的数进行softmax运算。)

Pytorch nn.Softmax(dim=?) 详解_第11张图片

 也就是按行运算。

你可能感兴趣的:(深度学习,pytorch,Softmax,Pytorch,深度学习)