首页 > 其他分享 >完善1x1卷积方案

完善1x1卷积方案

时间:2023-07-19 21:46:25浏览次数:30  
标签:3x3 完善 权重 卷积 1x1 数据 通道

完善1x1卷积方案

  • 1x1的卷积和3x3的卷积有什么区别?

    1x1卷积是一种特殊的卷积操作,它只对输入数据的每个像素点进行一次乘法和累加,而不需要构造3x3的矩阵。这样可以减少计算量和内存消耗,同时也可以改变输入数据的通道数,实现特征融合或降维。
    3x3卷积则是一种常见的卷积操作,它需要对输入数据的每个3x3的区域进行乘法和累加,同时也需要构造3x3的矩阵。这样可以增加计算量和内存消耗,同时也可以提取输入数据的特征和变换,也可以起到平滑或锐化的作用。
    
    例子:假设输入数据是8个通道,每个通道是13x13的矩阵,权重是8个通道,每个通道是1x1的矩阵,输出数据也是8个通道,每个通道是13x13的矩阵
    
    - 1x1卷积:对于每个输出通道,只需要将输入数据的同一位置的8个数与权重的8个数相乘再累加,得到一个数,放在输出矩阵的对应位置。重复这个过程169次(13x13),就得到一个输出通道。重复这个过程8次,就得到所有输出通道。
    
    - 3x3卷积:对于每个输出通道,需要先将输入数据填充一圈0,变成15x15的矩阵。然后将输入数据的每个3x3的子矩阵与权重的3x3的矩阵对应相乘再累加,得到一个数,放在输出矩阵的对应位置。重复这个过程169次(13x13),就得到一个输出通道。重复这个过程8次,就得到所有输出通道
    
    • 1x1卷积
      • 不需要构造3x3矩阵
      • 只进行一次乘法和累加
      • 可以改变通道数
      • 减少计算量和内存消耗
    • 3x3卷积
      • 需要构造3x3矩阵
      • 进行九次乘法和累加
      • 保持通道数不变
      • 增加计算量和内存消耗
    • 3x3卷积需要构造3x3的矩阵,进行9次乘法和累加操作,需要填充数据,输出尺寸会变小
    • 1x1卷积只需要进行一次乘法操作,不需要填充数据,输出尺寸不变
    • 两者都是让8个卷积通道并行计算,但是1x1卷积会导致一些DSP闲置
  • 1x1卷积的特点

    • 不需要构造3x3矩阵,直接将数据和权重相乘

    • 不需要做填充,输入和输出尺寸不变

    • 可以减少特征通道数,增加非线性,提高计算效率

    • YOLO网络中使用1x1卷积的原因有以下几点:

      • 降低计算复杂度。由于1x1卷积只涉及一个像素点和一个权重的乘法,所以它比3x3卷积更节省计算资源和时间。
      • 增加非线性。由于每个网格单元需要预测多个边界框和类别概率,所以YOLO网络需要有足够的表达能力来捕捉不同目标的特征。在3x3卷积层之间插入1x1卷积层可以增加网络的非线性,即增加网络的拟合能力。
      • 实现特征融合。由于YOLO网络需要同时处理不同尺度和形状的目标,所以YOLO网络需要融合不同层次和通道的特征。在不同深度的3x3卷积层之间插入1x1卷积层可以实现特征融合,即将不同通道的特征进行加权组合。
      例如,Yolo网络中的第13层使用了1x1卷积,它的输入尺寸是13x13x1024,输出尺寸是13x13x512,它相当于对每个13x13的特征图进行了一个降维操作,同时增加了激活函数
      
  • 1x1卷积的缺点

    • 不能捕捉空间信息,只能在通道维度上进行变换
    • 不能实现下采样,需要配合其他卷积或池化层使用
    • 会造成一些DSP资源的浪费,因为每个权重数据只占用8位,而RAM位宽为72位
  • 为什么要完善1x1卷积方案
    • 3x3卷积的加速方案,即让8个卷积通道同时并行计算
    • 对于1x1卷积,如果也使用8个卷积通道并行计算,那么就会导致一些DSP资源浪费,因为每个卷积通道只需要一个乘法操作,而不是9个
    • 如果能够利用所有的DSP资源,那么就可以计算更多的卷积通道,提高计算效率和吞吐量
    • 但是,如果要改变输入通道的数量,那么就需要重新设计整体的方案和代码结构,这样很复杂和麻烦
    • 所以,在这里,为了简化设计和保持一致性,还是采用8个卷积通道并行计算的方案,不管有没有DSP资源浪费
    • 这样,无论是3x3卷积还是1x1卷积,都可以使用同样的方案
  • 1x1卷积的加速方案

    • Yolo加速方案里让8个卷积通道同时并行计算
    • 对于1x1的卷积也让8个卷积通道同时并行计算
    • 这样会导致一些DSP闲置,因为只用到一个乘法器
    • 如果能利用所有的DSP,就能计算更多的卷积通道,意味着输入数据通道数也要变多
    • 但是这样就需要重新设计整体方案和代码结构,很复杂很麻烦
    • 所以还是让8个卷积通道并行计算,不管有没有DSP闲置
    • 结论:不管是3x3还是1x1的卷积,都是让8个卷积通道并行计算
    • 与3x3卷积一样,使用8个卷积通道并行计算,不考虑DSP资源的优化(即使有些DSP闲置)

      仍然让8个卷积通道并行计算,即使有些DSP闲置,避免改变整体方案和代码结构

    • 修改权重缓存模块,不进行3x3拼接,直接将8位权重写入RAM,剩余64位补零

    • 新建一个读数据控制模块,根据卷积类型和输入尺寸,从FIFO中读取整个通道的数据,并发送到卷积核计算模块

    • 修改卷积核计算模块,根据卷积类型,选择不同的数据和有效标志输入,并输出结果

    • 修改顶层模块,根据是否需要池化,选择将激活后或池化后的数据写入buffer

  • 如何完善1x1卷积方案
    • 完善1x1卷积方案主要涉及到两个方面:权重缓存和数据缓存

    • 对于权重缓存,因为不需要构造3x3的矩阵,所以可以省去拼接的操作,直接将8位的权重数据写入到72位的RAM中,每个权重数据占用一个RAM地址,剩余的64位可以补零。根据卷积类型信号来判断是否进行拼接或直接写入

      为了实现权重缓存,需要在FPGA内部定义8个通道的权重buffer,每个通道的buffer又包含8个RAM,每个RAM的位宽为72位,与输入数据通道相对应。

      image

    • 对于数据缓存,因为不需要做填充和矩阵构造,所以可以省去这两个模块,直接将从FIFO中读取的数据送到卷积核计算模块中。根据卷积类型信号来判断是否进行填充或直接读取。由于输入数据尺寸都小于buffer深度(13x13或26x26),所以可以直接读取整个通道的数据,不需要分段读取

    • 在代码上,需要根据卷积类型conv_type(0表示3x3卷积,1表示1x1卷积)来做一些判断和选择,例如:

      • 在权重缓存模块中,根据卷积类型来改变写使能信号和写地址信号
      • 在数据缓存模块中,根据卷积类型来改变读使能信号和读地址信号
      • 在转接计算模块中,根据卷积类型来改变数据输入信号和数据输出信号
graph TD A[开始] --> B[根据卷积类型信号判断是1x1还是3x3] B -->|1x1| C[从FIFO中读取输入数据] B -->|3x3| D[从FIFO中读取输入数据并进行填充] C --> E[将8位权重数据直接写入RAM中] D --> F[将8位权重数据拼接成72位并写入RAM中] E --> G[将输入数据和权重数据送到卷积核计算模块中进行逐元素乘法操作] F --> H[将输入数据和权重数据送到卷积核计算模块中进行滑动窗口乘法和累加操作] G --> I[将计算结果送到激活模块进行激活操作] H --> I I --> J[根据是否需要池化信号判断是否进行池化操作] J -->|不需要| K[将激活结果直接写入buffer中] J -->|需要| L[将激活结果送到池化模块进行池化操作] L --> M[将池化结果写入buffer中] K --> N[结束] M --> N
  • 1x1卷积的权重缓存和读取方法

    • 权重数据从PC端过来后,先缓存到FIFO里面
    • 权重数据从FIFO出来后,根据卷积类型判断是否需要拼接成72位
      • 如果是3x3卷积,需要拼接9个8位权重数据,每拼接完一次产生一次写使能信号
      • 如果是1x1卷积,不需要拼接,直接将8位权重数据写入RAM,每来一个数据产生一次写使能信号
    • 权重数据从RAM读出来后,根据输入通道数和输出通道数进行选择和分配
  • 1x1卷积的数据缓存和读取方法

    • 数据缓存方法和3x3卷积相同,都是先缓存到FIFO里面
    • 数据读取方法和3x3卷积不同,不需要进行填充和矩阵构造
      • 新建一个模块用于控制数据读取时序,根据输入尺寸(13x13或26x26)确定行数和列数
      • 当收到start信号时,产生buffer读使能信号,并开始计数器计数(col_cnt和row_cnt)
      • 当两个计数器都达到最大值时(12或25),拉低buffer读使能信号,并产生finish信号
      • 将buffer读出来的数据直接送到卷积核计算模块里面去,只取第一个8位数据,剩下的补0
  • 1x1卷积的计算方法和输出结果

    • 计算方法就是将输入数据和权重数据直接相乘,然后累加得到输出结果
    • 输出结果就是一个8位数据,不需要进行位宽调整或截断
  • 1x1卷积的后续处理(激活、池化等)

    • 根据网络结构,1x1卷积后面还有激活函数(ReLU或Leaky ReLU)和池化层(最大池化或平均池化)
    • 激活函数的作用是增加非线性,提高网络的表达能力
    • 池化层的作用是降低特征图的尺寸,减少计算量和参数量,防止过拟合
    • 但是在Yolo网络中,1x1卷积后面没有池化层,而是直接进入下一层的3x3卷积,所以不需要进行池化操作
    • 所以在输出结果时,需要根据是否需要池化来判断是将激活后的数据还是池化后的数据写入buffer里面
  • 举例说明
    • 假设输入数据为13x13x8的特征图(即13行13列8通道),权重数据为8位整数
    • 假设要进行1x1卷积操作,输出通道数为16(即每个输入通道对应两个输出通道)
    • 假设使用8个卷积通道并行计算的方案,即每个卷积通道处理一个输入通道和两个输出通道
    • 那么,完善1x1卷积方案的过程如下:
      • 权重缓存:从PC端接收权重数据,每次接收8个权重数据(即一个输入通道对应的两个输出通道的权重),直接写入到对应的RAM中,不需要拼接,剩余的64位补0
      • 数据缓存:从FIFO中读取输入数据,每次读取8个输入数据(即8个输入通道的同一位置的像素),直接送到卷积核计算模块中,不需要填充和矩阵构造
      • 卷积核计算:对每个卷积通道,将输入数据和权重数据相乘,然后累加,得到两个输出数据(即两个输出通道的同一位置的像素),然后进行激活和量化操作
      • 输出结果:将卷积核计算得到的输出数据写入到输出FIFO中,等待下一层卷积操作

标签:3x3,完善,权重,卷积,1x1,数据,通道
From: https://www.cnblogs.com/LiamJacob/p/17566844.html

相关文章

  • 深度学习(七)——神经网络的卷积操作
    卷积操作一、torch.nn中ConvolutionLayers函数的介绍1.参数介绍nn.Conv1d:Conv取自Convolution的前四个字母,1d代表的是一个一维操作。nn.Conv2d:2d表示是一个二维的操作,比如图像就是一个二维的。其余参数不常用,见官网文档:torch.nn—PyTorch2.0documentation......
  • ChatGPT帮助工程师写代码:从功能模块完善到成功执行,实现需求
    在软件开发过程中,经常会遇到需要完善功能模块、调试代码和解决问题的情况。为了提高效率,我们可以借助人工智能技术,例如OpenAI的ChatGPT语言模型,来协助我们进行代码编写和调试。本文将介绍一个案例,展示了如何利用ChatGPT的强大能力,让工程师轻松应对代码开发过程中的挑战。功能......
  • 空间注意力机制 卷积神经网络
    空间注意力机制与卷积神经网络简介空间注意力机制是一种在卷积神经网络中引入的机制,用于加强模型对于特定区域的关注程度。传统的卷积神经网络对于每个位置的特征处理是相同的,而空间注意力机制则允许模型根据输入的不同位置自适应地调整特征的权重,从而更好地捕捉图像中的重要信息......
  • 鸟类识别系统python+TensorFlow+Django网页界面+卷积网络算法+深度学习模型
    一、介绍鸟类识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名称。二、效果图片三、演示视频and代码视频+......
  • 狄利克雷卷积前缀和
    给定积性函数$f,g$,且已经得到$f,g$所有$\lfloor\frac{n}{i}\rfloor$处的前缀和$F,G$,现在要求$h=f*g$所有$\lfloor\frac{n}{i}\rfloor$处的前缀和。简单推导后可得:$$H(n)=\sum\limits_{i=1}^nf(i)G(\frac{n}{i})$$可以整数分块,对于所有的$\lfloor\frac{n}{i}\rfloo......
  • 狄利克雷卷积
     狄利克雷卷积主要在杜教筛中应用,他的原式是:设f和g为算数函数,定义f和g的卷积为(f*g)(n)=sum(f(d)g(n/d))他符合三种运算律:第一种:交换律  f*g=g*f第二种:结合律  (f*g)*h=f*(g*h)第三种:分配律  f*(h+g)=(f*h)+(f*g)......
  • TCN时间卷积网络——解决LSTM的并发问题
    TCN是指时间卷积网络,一种新型的可以用来解决时间序列预测的算法。在这一两年中已有多篇论文提出,但是普遍认为下篇论文是TCN的开端。论文名称:AnEmpiricalEvaluationofGenericConvolutionalandRecurrentNetworksforSequenceModeling作者:ShaojieBai1J.ZicoKolter2Vl......
  • 1.7 完善自定位ShellCode后门
    在之前的文章中,我们实现了一个正向的匿名管道ShellCode后门,为了保证文章的简洁易懂并没有增加针对调用函数的动态定位功能,此类方法在更换系统后则由于地址变化导致我们的后门无法正常使用,接下来将实现通过PEB获取GetProcAddrees函数地址,并根据该函数实现所需其他函数的地址自定位......
  • 【学习笔记】狄利克雷卷积与高级筛法
    狄利克雷卷积概念对于数论函数\(f,g\),定义其狄利克雷卷积\(h=f*g\),满足:\[h(n)=(f*g)(n)=\sum_{d\midn}f(d)g\left(\dfrac{n}{d}\right)\]运算律:满足交换律,显然具有对称性。满足结合律,等价于三个\(d_i\)贡献到\(n\)。满足加法的分配率。常见数论函数:\(\m......
  • 【学习笔记】狄利克雷卷积与高级筛法
    狄利克雷卷积概念对于数论函数\(f,g\),定义其狄利克雷卷积\(h=f*g\),满足:\[h(n)=(f*g)(n)=\sum_{d\midn}f(d)g\left(\dfrac{n}{d}\right)\]运算律:满足交换律,显然具有对称性。满足结合律,等价于三个\(d_i\)贡献到\(n\)。满足加法的分配率。常见数论函数:\(\m......