4 PyTorch模型搭建
4.1 网络模型创建
图像分类的经典网络模型:【可以查看使用torchvision.models里面实现的AlexNet、VGG、GoogleNet、ResNet、DenseNet等】
alexnet=torchvision.models.AlexNet()
densenet=torchvision.models.DenseNet()
方法1:初始化(构建子模块)
方法2:前向传播(拼接子模块)
4.2 nn.Module
所有网络层基类,管理网络属性
- 一个module可以包含多个子module
- 一个module相当于一个运算,必须实现forward()函数
- 每个module都有8个字典管理它的属性
-
parameters
:存储管理nn.Parameter类,如权值与偏置参数 -
modules
:存储管理nn.Module类,如卷积层与池化层 -
buffers:存储管理缓冲属性,如BN层中的running_mean
-
***_hooks:存储管理钩子函数
4.3 模型容器Containers
nn.Sequential
:顺序性,各网络层之间严格按顺序执行,常用于block构建
nn.ModuleList
:迭代性,常用于大量重复网络层构建,通过for循环实现重复构建
nn.ModuleDict
:索引性,常用于可选择的网络层
-
nn.Sequential:用于按顺序包装一组网络层
- 顺序性:各网络层之间严格按照顺序构建
- 自带forward():自带的forward()里,通过for循环依次执行前向传播运算
-
nn.ModuleList:用于包装一组网络层,以迭代方式调用网络层
主要方法:
- append():在ModuleList后面添加网络层
- extend():拼接两个ModuleList
- insert():指定在ModuleList中位置插入网络层
-
nn.ModuleDict:用于包装一组网络层,以索引方式调用网络层
主要方法:
- clear():清空ModuleDict
- items():返回可迭代的键值对(key-value pairs)
- keys():返回字典的键(key)
- values():返回字典的值(value)
- pop():返回一对键值,并从字典中删除
4.4 卷积层
卷积运算
:卷积核在输入信号(图像)上滑动,对应位置上进行相乘相加
卷积核:又称为滤波器、过滤器,可认为是某种模式、某种特征
卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取
AlexNet卷积核可视化,发现卷积核学习到的是边缘、条纹、色彩这些细节特征
4.4.1 1d/2d/3d卷积
卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积
- 1d(1维)卷积
- 2d(2维)卷积
- 3d(3维)卷积
4.4.2 卷积-nn.Conv2d()
-
nn.Conv2d()
功能:对多个二维信号(图像)进行二维卷积参数说明:
- in_channels:输入通道数
- out_channels:输出通道数,等于卷积核个数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充幅度,以保持输入图像与输出图像尺寸不变
- dilation:空洞卷积大小,以提升感受野
- groups:分组卷积设置组数
- bias:偏置
-
卷积运算后的特征图输出尺寸计算公式
其中,W为输入图像的尺寸(W),F为卷积核尺寸(kernel_size),P为填充幅度(padding),S为步长(stride)
4.4.3 转置卷积-nn.ConvTranspose
-
nn.ConvTranspose2d()
功能:转置卷积实现图像上采样(UpSample)参数说明:
- in_channels:输入通道数
- out_channels:输出通道数,等于卷积核个数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充幅度,以保持输入图像与输出图像尺寸不变
- dilation:空洞卷积大小,以提升感受野
- groups:分组卷积设置组数
- bias:偏置
-
转置卷积运算后的特征图输出尺寸计算公式
4.5 池化层
池化运算
:对信号(图像)进行“收集”并“总结”,类似水池收集水资源,因而得名池化层
- “收集":多变少(下采样)
- ”总结":最大值/平均值
-
nn.MaxPool2d()
功能:对二维信号(图像)进行最大值池化(下采样)参数说明:
- kernel_size:池化窗口尺寸
- stride:步长
- padding:填充幅度
- dilation:池化窗口间隔大小
- return_indices:记录最大池化像素索引
- ceil_mode:默认尺寸向下取整,设为True时,则尺寸向上取整
-
nn.AvgPool2d()
功能:对二维信号(图像)进行平均值池化(下采样)参数说明:
- kernel_size:池化窗口尺寸
- stride:步长
- padding:填充幅度
- ceil_mode:默认尺寸向下取整,设为True时,则尺寸向上取整
- count_include_pad:是否采用填充值用于计算
- divisor_override:除法因子
-
nn.MaxUnpool2d()
功能:对二维信号(图像)进行最大值反池化(上采样)参数说明:
- kernel_size:池化窗口尺寸
- stride:步长
- padding:填充幅度
4.6 全连接层
全连接层又称为线性层
,其每个神经元与上一层所有神经元相连实现对前一层的线性组合(线性变换)
-
nn.Linear()
功能:对一维信号(向量)进行线性组合参数说明:
- in_features:输入结点数
- out_features:输出结点数
- bias:是否需要偏置
计算公式: y = x W T + b i a s y=xW^T+bias y=xWT+bias
4.7 激活函数层
激活函数
对特征进行非线性变换,赋予多层神经网络具有深度的意义
-
nn.Sigmoid()
计算公式: y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+e−x1梯度公式: y ′ = y ∗ ( 1 − y ) y'=y*(1-y) y′=y∗(1−y)
特性:
- 输出值在(0,1),符合概率
- 导数范围是[0,0.25],易导致梯度消失
- 输出为非0均值,破坏数据分布
-
nn.tanh()
计算公式: y = s i n x c o s x = e x − e − x e x + e − x = 2 1 + e − 2 x + 1 y=\frac{sinx}{cosx}=\frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{2}{1+e^{-2x}}+1 y=cosxsinx=ex+e−xex−e−x=1+e−2x2+1梯度公式: y ′ = 1 − y 2 y'=1-y^2 y′=1−y2
特性:
- 输出值在(-1,1),数据符合0均值
- 导数范围是(0,1),易导致梯度消失
-
nn.ReLU()
计算公式: y = { x ( x > 0 ) 0 ( x ≤ 0 ) y = \left\{ {\begin{array}{cc} {x \enspace (x \gt 0)}\\ {0 \enspace (x \le 0)} \end{array}} \right. y={x(x>0)0(x≤0)梯度公式: y ′ = { 1 ( x > 0 ) 0 ( x ≤ 0 ) y' = \left\{ {\begin{array}{cc} {1 \enspace (x \gt 0)}\\ {0 \enspace (x \le 0)} \end{array}} \right. y′={1(x>0)0(x≤0)
特性:
- 输出值均为正数,负半轴导致死神经元
- 导数是1,缓解梯度消失,但易引发梯度爆炸
-
nn.LeakyReLU()
- negative_slope:负半轴斜率
-
nn.PReLU()
- init:可学习斜率
-
nn.RReLU()
- lower:均匀分布下限
- upper:均匀分布上限