Python Pytorch softmax:使用什么维度?

Python Pytorch softmax:使用什么维度?,python,pytorch,Python,Pytorch,函数torch.nn.functional.softmax采用两个参数:input和dim。根据其文档,softmax操作将应用于沿指定的dim的输入的所有切片,并将重新缩放这些切片,以便元素位于范围(0,1)内,总和为1 让输入为: input = torch.randn((3, 4, 5, 6)) 假设我需要以下内容,因此该数组中的每个条目都是1: sum = torch.sum(input, dim = 3) # sum's size is (3, 4, 5, 1) 我应该如何应用so

函数
torch.nn.functional.softmax
采用两个参数:
input
dim
。根据其文档,softmax操作将应用于沿指定的
dim
输入的所有切片,并将重新缩放这些切片,以便元素位于范围
(0,1)
内,总和为1

让输入为:

input = torch.randn((3, 4, 5, 6))
假设我需要以下内容,因此该数组中的每个条目都是1:

sum = torch.sum(input, dim = 3) # sum's size is (3, 4, 5, 1)
我应该如何应用softmax

softmax(input, dim = 0) # Way Number 0
softmax(input, dim = 1) # Way Number 1
softmax(input, dim = 2) # Way Number 2
softmax(input, dim = 3) # Way Number 3
我的直觉告诉我这是最后一个,但我不确定。英语不是我的第一语言,因此我对
这个词的使用感到困惑


我不太清楚“沿着”是什么意思,所以我会用一个例子来说明问题。假设我们有一个大小张量(S1,S2,S3,S4),并且我希望这发生在

让我们考虑二维< /P>的例子。

x = [[1,2],
    [3,4]]
你希望你的最终结果是什么

y = [[0.27,0.73],
    [0.27,0.73]]

如果它是第一个选项,那么您希望dim=1。如果是第二个选项,则dim=0

请注意,在第二个示例中,列或第零维是标准化的,因此它是沿着第零维标准化的


更新2018-07-10:以反映第零维度是指pytorch中的列

我能想到的让你理解的最简单的方法是:假设给你一个形状的张量
(s1,s2,s3,s4)
,正如你提到的,你想让沿最后一个轴的所有项之和为1

sum = torch.sum(input, dim = 3) # input is of shape (s1, s2, s3, s4)
然后,您应将softmax称为:

softmax(input, dim = 3)
为了便于理解,可以考虑形状<代码>(S1,S2,S3,S4)< /代码>的4D张量作为2D张量或形状<代码>(S1*S2*S3,S4)< /代码>的矩阵。现在,如果您希望矩阵中的每一行(轴=0)或每一列(轴=1)中的值总和为1,则只需调用2d张量上的
softmax
函数,如下所示:

softmax(input, dim = 0) # normalizes values along axis 0
softmax(input, dim = 1) # normalizes values along axis 1
你可以看到史蒂文在他的文章中提到的例子是不正确的。请参见下面的快照。其实情况正好相反

图像转录为代码:

>>> x = torch.tensor([[1,2],[3,4]],dtype=torch.float)
>>> F.softmax(x,dim=0)
tensor([[0.1192, 0.1192],
        [0.8808, 0.8808]])
>>> F.softmax(x,dim=1)
tensor([[0.2689, 0.7311],
        [0.2689, 0.7311]])

我不能100%确定您的问题的意思,但我认为您的困惑在于您不理解
dim
参数的含义。因此,我将对此进行解释并提供示例

如果我们有:

m0 = nn.Softmax(dim=0)
这意味着
m0
将沿着它接收的张量的第零个坐标对元素进行规格化。正式地说,如果给定一个大小为
(d0,d1)
的张量
b
,则以下为真:

sum^{d0}_{i0=1} b[i0,i1] = 1, forall i1 \in {0,...,d1}
您可以通过Pytorch示例轻松检查这一点:

>>> b = torch.arange(0,4,1.0).view(-1,2)
>>> b 
tensor([[0., 1.],
        [2., 3.]])
>>> m0 = nn.Softmax(dim=0) 
>>> b0 = m0(b)
>>> b0 
tensor([[0.1192, 0.1192],
        [0.8808, 0.8808]])
既然
dim=0
意味着在{0,1}
中通过
i0\n(即通过行),如果我们选择任何列
i1
并对其元素(即行)求和,那么我们应该得到1。检查它:

>>> b0[:,0].sum()
tensor(1.0000)
>>> b0[:,1].sum()
tensor(1.0000)
正如所料

注:我们确实可以通过使用torch(b0,dim=0)将所有行相加为1,请检查:

>>> torch.sum(b0,0)
tensor([1.0000, 1.0000])

我们可以创建一个更复杂的示例,以确保它真正清晰

a = torch.arange(0,24,1.0).view(-1,3,4)
>>> a
tensor([[[ 0.,  1.,  2.,  3.],
         [ 4.,  5.,  6.,  7.],
         [ 8.,  9., 10., 11.]],

        [[12., 13., 14., 15.],
         [16., 17., 18., 19.],
         [20., 21., 22., 23.]]])
>>> a0 = m0(a)
>>> a0[:,0,0].sum()
tensor(1.0000)
>>> a0[:,1,0].sum()
tensor(1.0000)
>>> a0[:,2,0].sum()
tensor(1.0000)
>>> a0[:,1,0].sum()
tensor(1.0000)
>>> a0[:,1,1].sum()
tensor(1.0000)
>>> a0[:,2,3].sum()
tensor(1.0000)
因此,正如我们预期的,如果我们沿着第一个坐标从第一个值到最后一个值求和所有元素,我们得到1。因此,所有内容都沿着第一个维度(或第一个坐标
i0
)进行规范化


沿着维度0也意味着沿着这个维度改变坐标并考虑每个元素。有点像有一个for循环遍历第一个坐标可以取的值

for i0 in range(0,d0):
    a[i0,b,c,d]

请参阅下面的正确答案。上述说法是错误的@Steven@Steven我如何从这两个选项中选择我想要的?我不知道我想要哪个选项。@Lupos您可以选择与您的特征相对应的尺寸。通常是最后一个维度,但不一定是这样。a-1的作用是什么?@CharlieParker这意味着采用最后一个维度a-1的作用是什么?a-1的作用是什么?所以数组中的每个条目都是1:“意味着什么?”?你能澄清你的问题吗?沿着<代码>昏暗=0 < /代码>表示如下:考虑一张张量<代码> t>代码>大小<代码>(S0,S1,S2,S3)< /代码>。然后沿着维度
0
前进意味着我们可以在该维度索引的坐标范围从该维度的number元素的开始到结束。在这种情况下,它意味着通过
t[0,b,c,d],t[i0,b,c,d],t[s0,b,c,d]
。只需检查第零个坐标的所有值。我认为最好将此图像添加为可以搜索和复制粘贴的实际代码。
>>> torch.sum(a0,0)
tensor([[1.0000, 1.0000, 1.0000, 1.0000],
        [1.0000, 1.0000, 1.0000, 1.0000],
        [1.0000, 1.0000, 1.0000, 1.0000]])
for i0 in range(0,d0):
    a[i0,b,c,d]