当前位置: 首页 > news >正文

计算机视觉(CV)——卷积神经网络基础

1. 卷积层

1.1 含义
  • 对图像和滤波矩阵做内积(逐个元素相乘再求和)的操作
# 二维卷积示例
nn.Conv2d(in channels, out channels, kernel size, stride=1,padding=0, dilation=1, groups=1, bias=True)

各参数含义

  • in_channels
    输入的四维张量[N, C, H, W]中的C,即输入张量的channels数。这个形参是确定权重等可学习参数的shape所必需的。
  • out_channels
    即期望的四维输出张量的channels数。
  • kernel_size
    卷积核的大小,一般我们会使用5x5、3x3这种左右两个数相同的卷积核,因此这种情况只需要写kernel_size = 5这样的就行了。如果左右两个数不同,比如3x5的卷积核,那么写作kernel_size = (3, 5),注意需要写一个tuple,而不能写一个列表(list)。
  • stride
    卷积核在图像窗口上每次平移的间隔,即所谓的步长。这个概念和Tensorflow等其他框架没什么区别。
  • padding
    Pytorch与Tensorflow在卷积层实现上最大的差别就在于padding上。Padding即所谓的图像填充,后面的int型常数代表填充的多少(行数、列数),默认为0。需要注意的是这里的填充包括图像的上下左右,以padding = 1为例,若原始图像大小为32x32,那么padding后的图像大小就变成了34x34,而不是33x33。
  • dilation = 1
    这个参数决定了是否采用空洞卷积,默认为1(不采用)。从中文上来讲,这个参数的意义是从卷积核上的一个参数到另一个参数需要走过的距离,那当然默认是1了,毕竟不可能两个不同的参数占同一个地方吧(为0)。
  • groups = 1
    决定是否采用分组卷积,现在用的比较多的是groups = in_channel。当groups = in_channel时,是在做的depth-wise conv的,具体思想可以参考MobileNet那篇论文。
  • bias = True
    是否要添加偏置参数作为可学习参数的一个,默认为True。
  • padding_mode = ‘zeros’
    即padding的模式,默认采用零填充。
    在这里插入图片描述
1.2 感受野(Receptive Field)
  • 指的是神经网络中神经元“看到的”输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野
1.3 卷积层的参数量与计算量
  • 参数量:参与计算参数的个数占用内存空间
    在这里插入图片描述
    FLOPS:每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标;
    FLOPs:浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
    在这里插入图片描述
  • MAC:乘加次数,用来衡量计算量。
    在这里插入图片描述

2. 池化层

2.1 定义
  • 对输入的特征图进行压缩
  • 一方面使特征图变小,简化网络计算复杂度
  • 一方面进行特征压缩,提取主要特征
    最大池化(Max Pooling)、平均池化(Average Pooling)等
    Max Pooling的例子:
    在这里插入图片描述
# pytorch中的调用
nn.MaxPool2d(kernel size, stride=None, padding=0, dilation=1return indices=False, ceil mode=False)

各参数含义

  • kernel_size
    注意这里的 kernel_size 跟卷积核不是一个东西。 kernel_size 可以看做是一个滑动窗口,这个窗口的大小由自己指定,如果输入是单个值,例如 3 ,那么窗口的大小就是 3 × 3 ,还可以输入元组,例如 (3, 2) ,那么窗口大小就是 3 × 2。
  • stride
    上一个参数我们确定了滑动窗口的大小,现在我们来确定这个窗口如何进行滑动。如果不指定这个参数,那么默认步长跟最大池化窗口大小一致。如果指定了参数,那么将按照我们指定的参数进行滑动。例如 stride=(2,3) , 那么窗口将每次向右滑动三个元素位置,或者向下滑动两个元素位置
  • padding
    这参数控制如何进行填充,填充值默认为0。如果是单个值,例如 1,那么将在周围填充一圈0。还可以用元组指定如何填充,例如 padding = ( 2 , 1 ),表示在上下两个方向个填充两行0,在左右两个方向各填充一列0。
  • dilation
    空洞卷积,默认 dilation=1,如果kernel_size =3,那么卷积核就是33的框。如果dilation = 2,kernel_size =3,那么每列数据与每列数据中间再加一列空洞,那么卷积核就变成5x5的框。
  • return_indices
    这是个布尔类型值,表示返回值中是否包含最大值位置的索引。注意这个最大值指的是在所有窗口中产生的最大值,如果窗口产生的最大值总共有5个,就会有5个返回值。
  • ceil_mode
    这个也是布尔类型值,它决定的是在计算输出结果形状的时候,是使用向上取整还是向下取整。

3. 上采样层

3.1 两种实现方式
  • Resize,如双线性插值直接缩放,类似于图像缩放,概念可见最邻近插值算法和双线性插值算法一图像缩放
  • 反卷积(Deconvolution),也叫Transposed Convolution
# Pytorch实现函数
nn.functional.interpolate(input, size=None, scale factor=None, mode='nearest, align corners=None) 
nn.ConvTranspose2d(in channels, out channels, kernel size, stride=1, padding=0, output_padding=0, bias=True)

4. 激活层

  • 激活函数:为了增加网络的非线性,进而提升网络的表达能力;
  • ReLU函数、Leakly ReLU函数、ELU函数等
torch.nn.ReLU(inplace=True)

5. BatchNorm层

  • 通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布
  • Batchnorm是归一化的一种手段,它会减小图像之间的绝对差异,突出相对差异加快训练速度
  • 不适用的问题:image-to-image以及对噪声敏感的任务
    nn.BatchNorm2d(num features, eps=1e-05,momentum=0.1, affine=True.track running_stats=True)

6. 全连接层

  • 连接所有的特征,将输出值送给分类器 (如softmax分类器)
  • 对前层的特征进行一个加权和, (卷积层是将数据输入映射到隐层特征空间)将特征空间通过线性变换映射到样本标记空间(也就是label)
  • 可以通过1x1卷积 + global average pooling代替
  • 可以通过全连接层参数几余
  • 全连接层参数和尺寸相关
nn.Linear(in features, out features, bias)

7. Dropout层

  • 在不同的训练过程中随机扔掉一部分神经元
  • 测试过程中不使用随机失活,所有的神经元都激活
  • 为了防止或减轻过拟合而使用的函数,它一般用在全连接层
nn.dropout

8. 损失层

  • 设置一个损失函数用来比较网络的输出和目标值,通过最小化损失来驱动网络的训练
  • 网络的损失通过前向操作计算,网络参数相对于损失函数的梯度则通过反向操作计算
# 分类问题损失(离散值,常用于分类/分割问题)
nn.BCELoss()
nn.CrossEntropyLoss()# 回归问题损失(连续值,常用于检测/预测)
nn.L1Loss
nn.MSELoss
nnSmoothL1Loss

9. 优化器

  • GD、BGD、SGD、MBGD
    • 引入了随机性和噪声
  • Momentum、NAG等
    • 加入动量原则,具有加速梯度下降的作用
  • AdaGrad,RMSProp,Adam、AdaDelta
    • 自适应学习率
torch.optim.Adam
http://www.lryc.cn/news/616112.html

相关文章:

  • Spring WebFlux开发指导
  • [Shell编程] Shell的正则表达式
  • JS实现数组扁平化
  • Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache
  • 【AI学习从零至壹】AI调用MCP抓包分析pcap原始报文
  • Spring Boot 开发三板斧:POM 依赖、注解与配置管理
  • 我如何从安全运维逆袭成企业CSO
  • 专题二_滑动窗口_串联所有单词的子串
  • SQL约束:数据完整性的守护者
  • 编程基础之多维数组——同行列对角线的格
  • 2.变量和常量
  • 【秋招笔试】2025.08.09美团秋招算法岗机考真题-第二题
  • 深度解析1688关键字搜索API接口:技术实现与应用探索
  • 电脑本地摄像头做成rtsp流调用测试windows系统中
  • 托福阅读记录
  • Shell脚本-四则运算符号
  • spring-boot-starter-data-redis 与 org.redisson 区别 联系
  • Shell脚本-数组定义
  • 数据结构:栈和队列(Stack Queue)基本概念与应用
  • 从0开始的中后台管理系统-5(userList页面功能实现)
  • JS数组排序算法
  • 第三章 向量
  • ECharts Y轴5等分终极解决方案 - 动态适配缩放场景
  • 计算机网络:(十四)传输层(下)详细讲解TCP报文段的首部格式,TCP 可靠传输的实现与TCP 的流量控制
  • 一些js数组去重的实现算法
  • Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏
  • 系统架构设计师备考之架构设计高级知识
  • Flink提交流程全解析:从模式到实践
  • DevOps:从GitLab .gitlab-ci.yml 配置文件到CI/CD
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型对决传统方法:多语言漏洞修复能力大比拼