【发布时间】:2020-01-11 21:01:19
【问题描述】:
我想知道在 pytorch 中使用 BatchNorm 进行训练时是否需要做一些特别的事情。据我了解,gamma 和 beta 参数使用梯度更新,这通常由优化器完成。但是,批次的均值和方差会使用动量缓慢更新。
- 那么我们是否需要在均值和方差参数更新时向优化器指定,还是 pytorch 会自动处理这个问题?
- 有没有办法访问 BN 层的均值和方差,以便我在训练模型时确保它发生变化。
如果需要,这里是我的模型和训练程序:
def bn_drop_lin(n_in:int, n_out:int, bn:bool=True, p:float=0.):
"Sequence of batchnorm (if `bn`), dropout (with `p`) and linear (`n_in`,`n_out`) layers followed by `actn`."
layers = [nn.BatchNorm1d(n_in)] if bn else []
if p != 0: layers.append(nn.Dropout(p))
layers.append(nn.Linear(n_in, n_out))
return nn.Sequential(*layers)
class Model(nn.Module):
def __init__(self, i, o, h=()):
super().__init__()
nodes = (i,) + h + (o,)
self.layers = nn.ModuleList([bn_drop_lin(i,o, p=0.5)
for i, o in zip(nodes[:-1], nodes[1:])])
def forward(self, x):
x = x.view(x.shape[0], -1)
for layer in self.layers[:-1]:
x = F.relu(layer(x))
return self.layers[-1](x)
培训:
for i, data in enumerate(trainloader):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
【问题讨论】:
标签: deep-learning pytorch