回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我第一次玩Pytork,我注意到在训练我的神经网络时,大约四分之一左右的损失会向左转向无穷远,然后很快就会消失。我看到了一些关于南宁的其他问题,但那里的建议似乎基本上是为了实现标准化;但是在我的网络下面的第一层是这样一个规范化,我仍然看到这个问题!完整的网络是<a href="https://github.com/dmwit/nurse-sveta/blob/803b0a2a17c5d82454a0765e300c440d6e5f1f5e/nsaid/nsaid/__main__.py" rel="nofollow noreferrer">a bit convoluted</a>,但是我已经做了一些调试,试图生成一个非常小的、可以理解的网络,它仍然显示相同的问题</p>
<p>代码如下;它由16个输入(0-1)组成,这些输入通过批处理规范化,然后通过完全连接的层传递到单个输出。我想让它学习总是输出1的函数,所以我取1的平方误差作为损失</p>
<pre><code>import torch as t
import torch.nn as tn
import torch.optim as to
if __name__ == '__main__':
board = t.rand([1,1,1,16])
net = tn.Sequential \
( tn.BatchNorm2d(1)
, tn.Conv2d(1, 1, [1,16])
)
optimizer = to.SGD(net.parameters(), lr=0.1)
for i in range(10):
net.zero_grad()
nn_outputs = net.forward(board)
loss = t.sum((nn_outputs - 1)**2)
print(i, nn_outputs, loss)
loss.backward()
optimizer.step()
</code></pre>
<p>如果您运行几次,最终会看到如下运行:</p>
<pre><code>0 tensor([[[[-0.7594]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(3.0953, grad_fn=<SumBackward0>)
1 tensor([[[[4.0954]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(9.5812, grad_fn=<SumBackward0>)
2 tensor([[[[5.5210]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(20.4391, grad_fn=<SumBackward0>)
3 tensor([[[[-3.4042]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(19.3966, grad_fn=<SumBackward0>)
4 tensor([[[[823.6523]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(676756.7500, grad_fn=<SumBackward0>)
5 tensor([[[[3.5471e+08]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(1.2582e+17, grad_fn=<SumBackward0>)
6 tensor([[[[2.8560e+25]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(inf, grad_fn=<SumBackward0>)
7 tensor([[[[inf]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(inf, grad_fn=<SumBackward0>)
8 tensor([[[[nan]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(nan, grad_fn=<SumBackward0>)
9 tensor([[[[nan]]]], grad_fn=<MkldnnConvolutionBackward>) tensor(nan, grad_fn=<SumBackward0>)
</code></pre>
<p>为什么我的损失归南,我能做些什么</p>