<p>我不能百分之百确定你的问题是什么意思,但我认为你的困惑仅仅是你不明白<code>dim</code>参数意味着什么。所以我将解释它并举例说明。</p>
<p>如果我们有:</p>
<pre><code>m0 = nn.Softmax(dim=0)
</code></pre>
<p>这意味着<code>m0</code>将沿着它接收的张量的第0个坐标对元素进行规范化。形式上,如果给定一个张量<code>b</code>的大小,比如<code>(d0,d1)</code>,那么以下是正确的:</p>
<pre><code>sum^{d0}_{i0=1} b[i0,i1] = 1, forall i1 \in {0,...,d1}
</code></pre>
<p>您可以通过Pytorch示例轻松检查:</p>
<pre><code>>>> 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]])
</code></pre>
<p>既然<code>dim=0</code>意味着通过<code>i0 \in {0,1}</code>(即通过行),如果我们选择任何列<code>i1</code>并对其元素(即行)求和,那么我们应该得到1。检查一下:</p>
<pre><code>>>> b0[:,0].sum()
tensor(1.0000)
>>> b0[:,1].sum()
tensor(1.0000)
</code></pre>
<p>如预期。</p>
<p>注意,我们通过使用<code>torch.sum(b0,dim=0)</code>“求和行”将所有行的总和设为1,请检查:</p>
<pre><code>>>> torch.sum(b0,0)
tensor([1.0000, 1.0000])
</code></pre>
<hr/>
<p>我们可以创建一个更复杂的示例,以确保它非常清晰。</p>
<pre><code>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)
</code></pre>
<p>所以正如我们所期望的,如果我们把所有元素从第一个值到最后一个值,沿着第一个坐标求和,我们得到1。所以所有的东西都是沿着第一个维度(或者第一个坐标)规范化的。</p>
<pre><code>>>> 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]])
</code></pre>
<hr/>
<p>同时,沿尺寸0意味着沿该尺寸改变坐标并考虑每个元素。有点像让for循环遍历第一个坐标可以取的值,即</p>
<pre><code>for i0 in range(0,d0):
a[i0,b,c,d]
</code></pre>