Pytorch softmax:使用啥维度?
Posted
技术标签:
【中文标题】Pytorch softmax:使用啥维度?【英文标题】:Pytorch softmax: What dimension to use?Pytorch softmax:使用什么维度? 【发布时间】:2018-08-08 18:31:12 【问题描述】:函数torch.nn.functional.softmax
有两个参数:input
和dim
。根据其文档,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) 的张量,我希望这种情况发生
【问题讨论】:
-1 有什么作用? “使该数组中的每个条目都是 1:”是什么意思?你能澄清你的问题想要什么吗? 沿着dim=0
意味着以下:考虑一个大小为(s0,s1,s2,s3)
的张量t
。然后沿着维度0
表示我们可以在该维度中索引的坐标范围从该维度的数字元素的开头到结尾。在这种情况下,这意味着通过t[0,b,c,d], ... , t[i0,b,c,d] , ... , t[s0,b,c,d]
。只需遍历第零坐标的所有值。
discuss.pytorch.org/t/… 可能会有所帮助..(使用 dim=1)softmax 函数沿轴 1 应用。这就是为什么所有行加起来为 1。(使用 dim=0)softmax 函数沿轴 0 应用。使所有列加起来为 1
【参考方案1】:
Steven's answer 不正确。请参阅下面的快照。实际上是相反的方式。
图像转录为代码:
>>> 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]])
【讨论】:
我认为最好将此图像添加为可以搜索和复制粘贴的实际代码。【参考方案2】:我能想到的让您理解的最简单方法是:假设您有一个形状为 (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 张量或矩阵。现在,如果您希望矩阵包含总和为 1 的每一行 (axis=0) 或每一列 (axis=1) 中的值,那么您可以简单地在 2d 张量上调用 softmax
函数,如下所示:
softmax(input, dim = 0) # normalizes values along axis 0
softmax(input, dim = 1) # normalizes values along axis 1
你可以看到 Steven 在他的answer 中提到的例子。
【讨论】:
-1 有什么作用? @CharlieParker 表示取最后一个维度【参考方案3】:让我们考虑二维的例子
x = [[1,2],
[3,4]]
你希望你的最终结果是
y = [[0.27,0.73],
[0.27,0.73]]
或
y = [[0.12,0.12],
[0.88,0.88]]
如果是第一个选项,那么你想要 dim = 1。如果是第二个选项,你想要 dim = 0。
请注意,在第二个示例中,列或第零维是标准化的,因此它是沿第零维标准化的。
2018 年 7 月 10 日更新:以反映第 0 维是指 pytorch 中的列。
【讨论】:
正确答案见下文。以上不正确@Steven @Steven 我如何从我想要的 2 中选择哪个选项?我不知道我想要哪个选项。 @Lupos 您选择与您的功能相对应的维度。它通常是最后一个维度,但不一定是这种情况。【参考方案4】:我不是 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
意味着遍历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。所以一切都沿第一个维度(或第一个坐标i0
)进行归一化。
>>> 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]
【讨论】:
【参考方案5】:import torch
import torch.nn.functional as F
x = torch.tensor([[1, 2], [3, 4]], dtype=torch.float)
s1 = F.softmax(x, dim=0)
tensor([[0.1192, 0.1192],
[0.8808, 0.8808]])
s2 = F.softmax(x, dim=1)
tensor([[0.2689, 0.7311],
[0.2689, 0.7311]])
torch.sum(s1, dim=0)
tensor([1., 1.])
torch.sum(s2, dim=1)
tensor([1., 1.])
【讨论】:
【参考方案6】:想想 softmax 想要达到的目标。它输出一种结果相对于另一种结果的概率。假设您试图预测两个结果:是 A 还是 B。如果 p(A) 大于 p(B),那么下一步是将结果转换为布尔值(即,如果 p (A) > 50% 或 B 如果 p(B) > 50% 因为我们正在处理概率,它们应该加起来为 1。 因此,您想要的是每行的总概率为 1。因此您指定 dim=1 或行总和
另一方面,如果您的模型旨在预测两个以上的变量,则输出张量将类似于 [p(a), p(b), p(c)...p(i)] 这里重要的是 p(a) + p(b) + p(c) +...p(i) = 1 那么你会使用 dim = 0
这完全取决于您如何定义输出层。
【讨论】:
以上是关于Pytorch softmax:使用啥维度?的主要内容,如果未能解决你的问题,请参考以下文章
pytorch深度学习实践_p9_多分类问题_pytorch手写实现数字辨识