模型创建
分为构建和拼接两步,构建是把卷积,全连接等层构建好,拼接是按一定顺序将这些层连接,前向传播。
torch.nn
- nn.Parameter 张量子类,表示可学习参数,weight,bias
- nn.Moduel 所有网络层基类,管理网络属性
–nn.functional 函数的具体实现,如卷积,池化,激活函数等 - nn.init 参数初始化方法
构建子模块
_init_()
nn.Module
最常用的parameters和modules字典,管理可学习参数和模型。
Containers
- nn.Sequential 按顺序包装
- nn.ModulelList 像python的list一样包装多个网络层
- nn.ModuleDict 像python的dict一样包装多个网络层
将Alexnet改写成OrderedDict,给层命名
class AlexNet(nn.Module):
def __init__(self, num_classes: int = 1000) -> None:
super(AlexNet, self).__init__()
self.features = nn.Sequential(OrderedDict({
'conv1': nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
'relu1': nn.ReLU(inplace=True),
'maxpool1':nn.MaxPool2d(kernel_size=3, stride=2),
'conv2': nn.Conv2d(64, 192, kernel_size=5, padding=2),
'relu2':nn.ReLU(inplace=True),
'maxpool2':nn.MaxPool2d(kernel_size=3, stride=2),
'conv3':nn.Conv2d(192, 384, kernel_size=3, padding=1),
'relu3':nn.ReLU(inplace=True),
'conv4':nn.Conv2d(384, 256, kernel_size=3, padding=1),
'relu4':nn.ReLU(inplace=True),
'conv5':nn.Conv2d(256, 256, kernel_size=3, padding=1),
'relu5':nn.ReLU(inplace=True),
'maxpool3':nn.MaxPool2d(kernel_size=3, stride=2),
}))
...
print(alexnet)
print(alexnet._modules['features']._modules.keys())#打印层别名
拼接子模块
forward()
ModuleList
- append() 在Moduleist后面添加网络层
- extend() 拼接两个ModuleList
- insert() 指定在Moduleist中位置插入网络层
主要用于重复层的构建,比如10层全连接,就很方便。
nn.ModuleDict
- clear() 清空ModuleDict
- items() 返回可迭代的键值对
- keys() 返回键
- values() 返回字典值
- pop() 返回一对键值,并从字典中删除
使用dict可以选择网络层,比如把激活函数都放一起,组装的时候选择其中一个。
卷积
卷积核在几个维度上滑动,就是几维卷积
nn.Conv2d 二维卷积
转置卷积
用于对图像进行上采样
卷积和转置卷积不是可逆的关系。
池化
nn.MaxPool2d
nn.MaxUnpool2d 反池化