【目录】
-
网路层容器(Containers) -
AlexNet构建
1、容器Containers
nn.ModuleList 可以像python list一样迭代
早期将一个大的模型划分为特征提取模块(Conv1、pool1)和分类模块(fc1)
LeNet网络封装为特征提取器和分类器两部分,分别用sequential进行包装,然后将两个sequential再包装为一个sequential。
class LeNetSequentialOrderDict(nn.Module):
def __init__(self, classes):
super(LeNetSequentialOrderDict, self).__init__()
#构建子模块并封装:特征提取器
self.features = nn.Sequential(OrderedDict({#利用OrderedDict()方法对各网络层构建有序字典,以便之后通过名称索引网络层
'conv1': nn.Conv2d(3, 6, 5),
'relu1': nn.ReLU(inplace=True),
'pool1': nn.MaxPool2d(kernel_size=2, stride=2),
'conv2': nn.Conv2d(6, 16, 5),
'relu2': nn.ReLU(inplace=True),
'pool2': nn.MaxPool2d(kernel_size=2, stride=2),
}))
#构建子模块并封装:分类器
self.classifier = nn.Sequential(OrderedDict({
'fc1': nn.Linear(16*5*5, 120),
'relu3': nn.ReLU(),
'fc2': nn.Linear(120, 84),
'relu4': nn.ReLU(inplace=True),
'fc3': nn.Linear(84, classes),
}))
def forward(self, x):
x = self.features(x)
x = x.view(x.size()[0], -1)
x = self.classifier(x)
return x
class ModuleList(nn.Module):
def __init__(self):
super(ModuleList, self).__init__()
self.linears = nn.ModuleList([nn.Linear(10, 10) for i in range(20)])#列表生成式20次循环,生成20个全连接层
def forward(self, x):
for i, linear in enumerate(self.linears):#利用for循环获取ModuleList中的每一个网络层,可以迭代的构建模型,选取网络层
x = linear(x)
return x
可以根据指定的名称去选取网络层
class ModuleDict(nn.Module):
def __init__(self):
super(ModuleDict, self).__init__()
self.choices = nn.ModuleDict({#可以根据指定的名称去选取网络层,可供选择的网络层
'conv': nn.Conv2d(10, 10, 3),
'pool': nn.MaxPool2d(3)
})
self.activations = nn.ModuleDict({#可供选择的激活函数
'relu': nn.ReLU(),
'prelu': nn.PReLU()
})
def forward(self, x, choice, act):
x = self.choices[choice](x)
x = self.activations[act](x)
return x
net = ModuleDict()
fake_img = torch.randn((4, 10, 32, 32))#输入图像随机初始化
output = net(fake_img, 'conv', 'relu')#对网络层进行选择
print(output)
?2、AlexNet网络的构建
注:torchvision里面提供了经典的常用的网络模型,如AlexNet、GoogleNet等经典网络
|