【PyTorch】04模型搭建

4 PyTorch模型搭建

4.1 网络模型创建

【PyTorch】3.1 模型创建

图像分类的经典网络模型:【可以查看使用torchvision.models里面实现的AlexNet、VGG、GoogleNet、ResNet、DenseNet等】

alexnet=torchvision.models.AlexNet()

densenet=torchvision.models.DenseNet()

在这里插入图片描述

  • 方法1:初始化(构建子模块)
  • 方法2:前向传播(拼接子模块)
    image-20220517142353664

4.2 nn.Module

所有网络层基类,管理网络属性

  1. 一个module可以包含多个子module
  2. 一个module相当于一个运算,必须实现forward()函数
  3. 每个module都有8个字典管理它的属性

【PyTorch】3.1 nn.Module

  • parameters:存储管理nn.Parameter类,如权值与偏置参数

  • modules:存储管理nn.Module类,如卷积层与池化层

  • buffers:存储管理缓冲属性,如BN层中的running_mean

  • ***_hooks:存储管理钩子函数
    在这里插入图片描述

4.3 模型容器Containers

【PyTorch】3.2 模型容器与AlexNet创建

nn.Sequential顺序性,各网络层之间严格按顺序执行,常用于block构建

nn.ModuleList迭代性,常用于大量重复网络层构建,通过for循环实现重复构建

nn.ModuleDict索引性,常用于可选择的网络层

image-20220517145659223

  • 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 卷积层

卷积运算:卷积核在输入信号(图像)上滑动,对应位置上进行相乘相加

卷积核:又称为滤波器、过滤器,可认为是某种模式、某种特征

卷积过程类似于用一个模板去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取

【PyTorch】3.3 nn网络层-卷积层

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)
    image-20220517173407172

4.4.3 转置卷积-nn.ConvTranspose

  • nn.ConvTranspose2d()
    在这里插入图片描述
    功能:转置卷积实现图像上采样(UpSample)

    参数说明:

    • in_channels:输入通道数
    • out_channels:输出通道数,等于卷积核个数
    • kernel_size:卷积核尺寸
    • stride:步长
    • padding:填充幅度,以保持输入图像与输出图像尺寸不变
    • dilation:空洞卷积大小,以提升感受野
    • groups:分组卷积设置组数
    • bias:偏置
  • 转置卷积运算后的特征图输出尺寸计算公式
    image-20220517173550065

4.5 池化层

池化运算:对信号(图像)进行“收集”并“总结”,类似水池收集水资源,因而得名池化层

  • “收集":多变少(下采样)
  • ”总结":最大值/平均值

【PyTorch】3.4 nn网络层-池化层

在这里插入图片描述

  • nn.MaxPool2d()
    image-20220517175348276
    功能:对二维信号(图像)进行最大值池化(下采样)

    参数说明:

    • 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 全连接层

全连接层又称为线性层其每个神经元与上一层所有神经元相连实现对前一层的线性组合(线性变换)

【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

4.7 激活函数层

激活函数对特征进行非线性变换,赋予多层神经网络具有深度的意义

【PyTorch】3.4 nn网络层-激活函数层

  • nn.Sigmoid()
    在这里插入图片描述
    计算公式: y = 1 1 + e − x y=\frac{1}{1+e^{-x}} y=1+ex1

    梯度公式: y ′ = y ∗ ( 1 − y ) y'=y*(1-y) y=y(1y)

    特性:

    • 输出值在(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+exexex=1+e2x2+1

    梯度公式: y ′ = 1 − y 2 y'=1-y^2 y=1y2

    特性:

    • 输出值在(-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(x0)

    梯度公式: 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(x0)

    特性:

    • 输出值均为正数,负半轴导致死神经元
    • 导数是1,缓解梯度消失,但易引发梯度爆炸
  • nn.LeakyReLU()

    • negative_slope:负半轴斜率
  • nn.PReLU()

    • init:可学习斜率
  • nn.RReLU()

    • lower:均匀分布下限
    • upper:均匀分布上限

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值