【PyTorch】3.1 模型创建
图像分类的经典网络模型:【可以查看使用torchvision.models里面实现的AlexNet、VGG、GoogleNet、ResNet、DenseNet等】
alexnet=torchvision.models.AlexNet()
densenet=torchvision.models.DenseNet()
- 方法1:初始化(构建子模块)
- 方法2:前向传播(拼接子模块)
所有网络层基类,管理网络属性
- 一个module可以包含多个子module
- 一个module相当于一个运算,必须实现forward()函数
- 每个module都有8个字典管理它的属性
【PyTorch】3.1 nn.Module
-
parameters:存储管理nn.Parameter类,如权值与偏置参数
-
modules:存储管理nn.Module类,如卷积层与池化层
-
buffers:存储管理缓冲属性,如BN层中的running_mean
-
***_hooks:存储管理钩子函数
【PyTorch】3.2 模型容器与AlexNet创建
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():返回一对键值,并从字典中删除
卷积运算:卷积核在输入信号(图像)上滑动,对应位置上进行相乘相加
卷积核:又称为滤波器、过滤器,可认为是某种模式、某种特征
卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取
【PyTorch】3.3 nn网络层-卷积层
AlexNet卷积核可视化,发现卷积核学习到的是边缘、条纹、色彩这些细节特征
4.4.2 卷积-nn.Conv2d()卷积维度:一般情况下,卷积核在几个维度上滑动,就是几维卷积
- 1d(1维)卷积
- 2d(2维)卷积
- 3d(3维)卷积
-
nn.Conv2d()
功能:对多个二维信号(图像)进行二维卷积参数说明:
- in_channels:输入通道数
- out_channels:输出通道数,等于卷积核个数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充幅度,以保持输入图像与输出图像尺寸不变
- dilation:空洞卷积大小,以提升感受野
- groups:分组卷积设置组数
- bias:偏置
-
卷积运算后的特征图输出尺寸计算公式
其中,W为输入图像的尺寸(W),F为卷积核尺寸(kernel_size),P为填充幅度(padding),S为步长(stride)
-
nn.ConvTranspose2d()
功能:转置卷积实现图像上采样(UpSample)参数说明:
- in_channels:输入通道数
- out_channels:输出通道数,等于卷积核个数
- kernel_size:卷积核尺寸
- stride:步长
- padding:填充幅度,以保持输入图像与输出图像尺寸不变
- dilation:空洞卷积大小,以提升感受野
- groups:分组卷积设置组数
- bias:偏置
-
转置卷积运算后的特征图输出尺寸计算公式
池化运算:对信号(图像)进行“收集”并“总结”,类似水池收集水资源,因而得名池化层
- “收集":多变少(下采样)
- ”总结":最大值/平均值
【PyTorch】3.4 nn网络层-池化层
-
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:填充幅度
全连接层又称为线性层,其每个神经元与上一层所有神经元相连实现对前一层的线性组合(线性变换)
【PyTorch】3.4 nn网络层-全连接层
-
nn.Linear()
功能:对一维信号(向量)进行线性组合参数说明:
- in_features:输入结点数
- out_features:输出结点数
- bias:是否需要偏置
计算公式: y = x W T + b i a s y=xW^T+bias y=xWT+bias
激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义
【PyTorch】3.4 nn网络层-激活函数层
-
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:均匀分布上限



