请注意以下几点:
- 我们复用了简单的循环构建模块(如卷积块 ConvBlocks),它们由相同的循环模式(卷积、激活函数、归一化)组成,并装入独立的 nn.Module 中。
- 我们构建了一个所需要层的列表,并最终使用「nn.Sequential()」将所有层级组合到了一个模型中。我们在 list 对象前使用「*」操作来展开它。
- 在前向传导过程中,我们直接使用输入数据运行模型。
2. PyTorch 环境下的简单残差网络
- class ResnetBlock(nn.Module):
- def __init__(self, dim, padding_type, norm_layer, use_dropout, use_bias):
- super(ResnetBlock, self).__init__()
- selfself.conv_block = self.build_conv_block(...)
-
- def build_conv_block(self, ...):
- conv_block = []
-
- conv_block += [nn.Conv2d(...),
- norm_layer(...),
- nn.ReLU()]
- if use_dropout:
- conv_block += [nn.Dropout(...)]
-
- conv_block += [nn.Conv2d(...),
- norm_layer(...)]
-
- return nn.Sequential(*conv_block)
-
- def forward(self, x):
- out = x + self.conv_block(x)
- return ou
在这里,ResNet 模块的跳跃连接直接在前向传导过程中实现了,PyTorch 允许在前向传导过程中进行动态操作。
3. PyTorch 环境下的带多个输出的网络
对于有多个输出的网络(例如使用一个预训练好的 VGG 网络构建感知损失),我们使用以下模式:
- class Vgg19(torch.nn.Module):
- def __init__(self, requires_grad=False):
- super(Vgg19, self).__init__()
- vgg_pretrained_features = models.vgg19(pretrained=True).features
- self.slice1 = torch.nn.Sequential()
- self.slice2 = torch.nn.Sequential()
- self.slice3 = torch.nn.Sequential()
-
- for x in range(7):
- self.slice1.add_module(str(x), vgg_pretrained_features[x])
- for x in range(7, 21):
- self.slice2.add_module(str(x), vgg_pretrained_features[x])
- for x in range(21, 30):
- self.slice3.add_module(str(x), vgg_pretrained_features[x])
- if not requires_grad:
- for param in self.parameters():
- param.requires_grad = False
-
- def forward(self, x):
- h_relu1 = self.slice1(x)
- h_relu2 = self.slice2(h_relu1)
- h_relu3 = self.slice3(h_relu2)
- out = [h_relu1, h_relu2, h_relu3]
- return out
(编辑:ASP站长网)
|