通常情况下,forward
函数会将多个层连接起来,并返回最后一个层的输出。在返回之前,我可以在最后一个层之后进行一些额外的处理吗?例如,进行标量乘法和通过.view
进行重塑?
我知道自动梯度计算会自动处理梯度。所以我不确定我的额外处理是否会干扰这个过程。谢谢。
回答:
pytorch通过计算图跟踪张量的梯度,而不是通过函数。只要你的张量具有requires_grad=True
属性,并且它们的grad
不为None
,你就可以(几乎)随意操作并仍然能够进行反向传播。
只要你使用的是PyTorch的操作(例如,列在这里的这里和这里),你应该没问题。
更多信息请参见这里。
例如(摘自torchvision的VGG实现):
class VGG(nn.Module): def __init__(self, features, num_classes=1000, init_weights=True): super(VGG, self).__init__() # ... def forward(self, x): x = self.features(x) x = self.avgpool(x) x = torch.flatten(x, 1) # <-- 你所询问的部分 x = self.classifier(x) return x
更复杂的例子可以在torchvision的ResNet实现中看到:
class Bottleneck(nn.Module): def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, base_width=64, dilation=1, norm_layer=None): super(Bottleneck, self).__init__() # ... def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: # <-- 条件执行! identity = self.downsample(x) out += identity # <-- 就地操作 out = self.relu(out) return out