当你设计一个网络时,你应该把规范化连接到哪里?例如,如果你有一个堆叠的变压器或注意力网络,在你有一个密集的层之后,在任何时候正常化是否有意义?
发布于 2019-06-12 10:39:23
原纸试图解释的是减少过度使用批处理标准化。
当你设计一个网络时,你应该把规范化连接到哪里?
在输入的早期设置规范化。不平衡的输入极值会导致不稳定。
如果您对输出进行正常化,这将不会阻止输入再次造成不稳定。
下面是解释BN所做的事情的小代码:
import torch
import torch.nn as nn
m = nn.BatchNorm1d(100, affine=False)
input = 1000*torch.randn(3, 100)
print(input)
output = m(input)
print(output)
print(output.mean()) # should be ~ 0
print(output.std()) # should be ~ 1在你有一个致密的图层之后,任何时候正常化是否有意义?
是的,你可以这样做,因为矩阵乘法可能会导致极值。此外,卷积层后,因为这些也是矩阵乘法,类似但不太强烈的密集(nn.Linear)层。例如,如果您打印resent模型,您将看到每次在conv层之后设置批处理规范,如下所示:
(conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
(bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)要打印完整的resnet,可以使用以下内容:
import torchvision.models as models
r = models.resnet18()
print(r)https://stackoverflow.com/questions/56535040
复制相似问题