网络模型的创建
模型
模型构建两要素:构建子模块(_init_())和拼接子模块(forward())。
torch.nn
- nn.Parameter:张量子类,表示可学习参数,如weight,bias。
- nn.Module:所有网络层基类,管理网络属性。
- nn.functional:函数具体实现,如卷积,池化,激活函数等。
- nn.init:参数初始化方法。
nn.Module
- patameters:存储管理nn.Parameter类。
- modules:存储管理nn.Module类。
- buffers:存储管理缓冲属性,如BN层中的running_mean。
- ***_hooks:存储管理钩子函数。
- 一个module可以包含多个子module。
- 一个module相当于一个运算,必须实现forward()函数。
- 每个module都有8个字典管理它的属性。
容器
Containers
nn.Sequential
是nn.module的容器,用于按顺序包装一组网络层。
- 顺序性:各网络层之间严格按照顺序构建。
- 自带forward():自带的forward里,通过for循环一次执行前向传播运算。
nn.ModuleList
是nn.module的容器,用于包装一组网络层,以迭代方式调用网络层。
主要方法:
- append():在ModuleList后面添加网络层。
- extend():拼接两个ModuleList。
- insert():指定在ModuleList中位置插入网络层。
nn.ModuleDict
是nn.module的容器,用于包装一组网络层,以索引方式调用网络层。
主要方法:
- clear():清空ModuledDict。
- items():返回可迭代的键值对(key-value pairs)。
- keys():返回字典的键(key)。
- values():返回字典的值(value)。
- pop():返回一对键值,并从字典中删除。
容器总结
- nn.Sequential:顺序性,各网络层之间严格按顺序执行,常用于block构建。
- nn.ModuleList:迭代性:常用于大量重复网构建,通过for循环实现重复构建。
- nn.ModuleDict:索引性,常用于可选择的网络层。
AlexNet构建
特点如下:
- 采用ReLU:替换饱和激活函数,减轻梯度消失。
- 采用LRN(Local Response Normalization):对数据归一化,减轻梯度消失。
- Dropout:提高全连接层的鲁棒性,增加网络的泛华能力。
- Data Augmentation:TenCrop,色彩修改。
卷积
卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加
卷积核:又称为滤波器,过滤器,可认为是某种模式,某种特征。
卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。
AlexNet卷积核可视化,发现卷积核学习到的是边缘,条纹,色彩这一些细节模式。
卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积。
nn.Conv2d
功能:对多个二维信号进行二维卷积。
主要参数:
- in_channels:输入通道数。
- out_channels:输出通道数,等价于卷积核个数。
- kernel_size:卷积核尺寸。
- stride:步长。
- padding:填充个数。
- dilation:空洞卷积大小(有间隔的)。
- groups:分组卷积设置。
- bias:偏置。
尺寸计算:
简化版:
完整版:
转置卷积
转置卷积又称为反卷积(Deconvolution)和部分跨越卷积(Fractionally strided Convolution),用于对图像进行上采样(UpSample)
为什么称为转置卷积?
正常卷积:
假设图像尺寸为4*4,卷积核为3*3,padding=0,stride=1
图像: 卷积核:
输出:
转置卷积:
假设图像尺寸为2*2,卷积核为3*3,padding=0,stride=1
图像: 卷积核:
输出:
尺寸计算:
简化版:
完整版:
池化层
池化运算:对信号进行收集并总结,类似水池收集水资源,因而得名为池化层。
- 收集:多变少
- 总结:最大值/平均值
nn.MaxPool2d
功能:对二维信号(图像)进行最大值池化。
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- paddding:填充个数
- dilation:池化核间隔大小
- ceil_mode:尺寸向上取整
- return_indices:记录池化像素索引
nn.AvgPool2d
功能:对二维信号(图像)进行平均值池化。
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- paddding:填充个数
- ceil_mode:尺寸向上取整
- count_include_pad:填充值用于计算
- divisor_override:除法因子
nn.MaxUnpool2d
功能:对二维信号(图像)进行最大值池化上采样。
主要参数:
- kernel_size:池化核尺寸
- stride:步长
- paddding:填充个数
线性层
线性层又称为全连接层,其每个神经元与上一层所有神经元相连实现对前一层的线性组合,线性变换。
nn.Linear
功能:对一堆信号(向量)进行线性组合
主要参数:
- in_features:输入结点数
- out_features:输出结点数
- bias:是否需要偏置
计算公式:
激活函数层
激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义。
nn.Sigmoid
nn.tanh
nn.ReLU
nn.LeakyReLU
- negative_slope:负半轴斜率
nn.PReLU
- init:可学习斜率
nn.RReLU
- lower:均匀分布下限
- upper:均匀分布上限