Pythorch softmax:使用什么尺寸?

2024-05-09 01:21:02 发布

您现在位置:Python中文网/ 问答频道 /正文

函数torch.nn.functional.softmax有两个参数:inputdim。根据它的文档,softmax操作应用于沿着指定的dim的所有input片,并将重新缩放它们,使元素位于(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

我的直觉告诉我这是最后一个,但我不确定。英语不是我的第一语言,因此使用along这个词似乎让我感到困惑。

我不太清楚“一路”是什么意思,所以我将用一个例子来说明问题。假设我们有一个大小张量(s1,s2,s3,s4),我希望这样


Tags: 函数文档元素numberinput参数nntorch
3条回答

我能想到的让你理解的最简单的方法是:假设给你一个形状为(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张量看作形状(s1*s2*s3, s4)的2d张量矩阵。现在,如果希望矩阵在每一行(轴=0)或每一列(轴=1)中包含和为1的值,那么可以简单地调用2d张量上的softmax函数,如下所示:

softmax(input, dim = 0) # normalizes values along axis 0
softmax(input, dim = 1) # normalizes values along axis 1

你可以看到史蒂文在他的answer中提到的例子。

我不能百分之百确定你的问题是什么意思,但我认为你的困惑仅仅是你不明白dim参数意味着什么。所以我将解释它并举例说明。

如果我们有:

m0 = nn.Softmax(dim=0)

这意味着m0将沿着它接收的张量的第0个坐标对元素进行规范化。形式上,如果给定一个张量b的大小,比如(d0,d1),那么以下是正确的:

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意味着通过i0 \in {0,1}(即通过行),如果我们选择任何列i1并对其元素(即行)求和,那么我们应该得到1。检查一下:

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

如预期。

注意,我们通过使用torch.sum(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。所以所有的东西都是沿着第一个维度(或者第一个坐标)规范化的。

>>> 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]])

同时,沿尺寸0意味着沿该尺寸改变坐标并考虑每个元素。有点像让for循环遍历第一个坐标可以取的值,即

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

enter image description here

史蒂文上面的回答不对。请参阅下面的快照。事实上正相反。

相关问题 更多 >