im2col+gemm实现卷积基础

这篇具有很好参考价值的文章主要介绍了im2col+gemm实现卷积基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

卷积可视化解释:

YJango的卷积神经网络——介绍 - 知乎

NCHW/NHWC到NC1HWC0数据格式图解

C1=C/C0,不足的部分补0。C0通常为4、8、16等。

im2col+gemm实现卷积基础

im2col原理

滑窗卷积和im2col后二维矩阵数据保存的关系如下图(filter im2col转矩阵相对比较简单,直接每个通道的卷积核展开成一个列向量和padding即可)。

这里演示的卷积filter大小为2x2,stride=1。特殊情况filter大小为1x1时最简单,每个channel数据直接就对应于im2col后矩阵的一行。

第一步滑窗filter覆盖的4个pixel数据对应于黑色条带覆盖的部分。第二步滑窗filter覆盖的4个pixel数据对应于蓝色条带覆盖的部分。然后黄色和青色条带对应于第三步和第四步滑窗。

im2col+gemm实现卷积基础

实际内存读取的方式如下图,从内存连续读取从而充分利用cache。

        图中黑色条带显示了从起始地址连续读取3个c0通道元素,这相当于读取了3步(0-2步)滑窗卷积对应于filter(0,0)位置的数据。这相当于是批处理读取了3步滑窗的数据。蓝色条带显示了从黑色条带往后移动一个c0位置再连续读取3个c0通道元素,这相当于读取了0-2步滑窗卷积对应于filter(0,1)位置的数据。

        但是,对于2x2大小的filter下一步则不是继续往后移动一个c0位置再读取。这时候可以考虑进行横向移动,按黄色条带所示连续读取3个c0通道元素,相当于读取与前面相同3步(0-2步)滑窗卷积对应于filter(1,0)位置的数据。然后再从黄色条带位置往后移动一个c0位置,按青色条带显示方式读取3个c0通道元素,相当于读取0-2步滑窗卷积对应于filter(1,1)位置的数据。

        当然,在前面蓝色条带读取后,也可以考虑直接往后移动到黑色条带的结束位置,按绿色条带显示的方式连续读取3个c0通道元素,这相当于读取了新的3步(3-5步)滑窗卷积对应于filter(0,0)位置的数据。然后再往后移动一个c0位置,按橘色条带读取3个c0通道元素,这相当于读取了新的3步(3-5步)滑窗卷积对应于filter(0,1)位置的数据。这样相比直接跳转到黄色条带部分读取应该能更好的利用cache数据。当然这里应该要综合考虑矩阵乘法分块大小和double buffer数据准备的方式。如果一个处理线程本来就要处理2n*批处理滑窗步数卷积的元素,则可以考虑这样读取。

        这两种方式的区别一种是优先读取每个批处理滑窗在每个filter元素覆盖的数据,另一种是先读取分块范围内所有滑窗steps的filter第1行像素覆盖的数据,再读取所有滑窗steps的filter第2行像素覆盖的数据。同样的方式也适用于处理不同c0的元素(图中红色和橙色矩阵的元素),一种是读取了第一个批处理滑窗在c0的元素然后直接切换到第二个c0继续读取第一个批处理滑窗位于第二个c0的元素。也可以在分块范围内读取了所有批处理滑窗在c0的元素后再切换到第二个c0读取。

im2col+gemm实现卷积基础

im2col实现方案

方案1:把im2col是做成一个单独的算子,把卷积拆分为im2col+MatMul两个算子,也被称为显式矩阵乘卷积(explicit GEMM convolution)。

方案2:把im2col做成矩阵乘数据读取的部分,并与真正矩阵乘实现double buffer,从而避免中间数据的读写global mem,也被称为隐式矩阵乘卷积(implicit GEMM convolution)。

方案1实施起来更加简单,但是存在中间数据的写回和读取和矩阵乘读取global mem,占用内存空间大,性能差。方案2基于一个整体算子来实施,实现过程相对比较复杂,但是性能更高,内存占用更少。

todo:

如何基于矩阵分块等方法进行并行加速,基于GPU实现细节。

REF

图解NC4HW4使用im2col+gemm计算卷积 - 知乎

Tensor中数据摆放顺序NC4HW4是什么意思,只知道NCHW格式,能解释以下NC4HW4格式吗? - 知乎

【模型推理】谈谈为什么卷积加速更喜欢 NHWC Layout - 知乎

im2col方法实现卷积算法 - 知乎

im2col矩阵卷积原理_damonlearning的博客-CSDN博客_im2col 卷积

OpenPPL 中的卷积优化技巧 - 知乎文章来源地址https://www.toymoban.com/news/detail-400082.html

到了这里,关于im2col+gemm实现卷积基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字图像处理实验(六)|图像分割{阈值分割、直方图法、OTUS最大类间方差法(edge、im2dw、imfilter、imresize)、迭代阈值法、点检测}(附matlab实验代码和截图)

    1 理解阈值分割的依据及确定阈值的方法; 2 掌握常用的边缘检测算子的使用方法,加深对不同算子优缺点的理解; 3 能够自行评价各主要算子在无噪声条件下和噪声条件下的分割性能; 1. 直方图法 测试图像:coins.png 原理:观察该图像的直方图,手动选取谷底点作为阈值对

    2024年02月05日
    浏览(44)
  • “深度学习”学习日记:Tensorflow实现VGG每一个卷积层的可视化

    2023.8.19 深度学习的卷积对于初学者是非常抽象,当时在入门学习的时候直接劝退一大班人,还好我坚持了下来。可视化时用到的图片(我们学校的一角!!!)以下展示了一个卷积和一次Relu的变化  作者使用的GPU是RTX 3050ti 在这张图像上已经出现了Cuda out of memory了。防止其他

    2024年02月11日
    浏览(31)
  • IMS基础知识

    前言 广义NGN (Next Generation Network)指的是下一代融合网络;狭义NGN特指以软交换为控制层面,主要以VolP业务为主,增强了业务开放型和灵活性,逐步替代传统的PSTN(公用电话交换网)网络。其主要思想是在一个统一的网络平台上以统一管理的方式提供多媒体业务,整合现有的市内

    2024年02月15日
    浏览(26)
  • Element UI el-row el-col实现一行5列

    2024年02月09日
    浏览(31)
  • # Pytorch 深度卷积模型的特征可视化

    可视化模型的特征层需要打印各层的名称: 安装torchsummary包 打印各层名称

    2024年02月16日
    浏览(28)
  • 机器学习第一周:用卷积神经网络实现Mnist手写数字识别(付基础知识解释)

    MNIST 数据集是一个手写数字识别数据集,包含了 60000 张训练图像和 10000 张测试图像,每张图像都是 28x28 像素的灰度图像。 在这个代码中,我们首先使用了 numpy 库中的 np.random.seed() 方法来设置随机种子,以确保结果可重复。 然后,我们使用了 Keras 中的 mnist.load_data() 方法来

    2024年02月08日
    浏览(30)
  • 卷积神经网络中的图像特征——以YOLOv5为例进行可视化

    一、图像特征 1. 图像低层特征 图像低层特征指的是:边缘、颜色和纹理等特征。 低层特征的分辨率较高,包含较多的位置、细节信息,但其包含的语义信息较少,噪声较多。 原始图像和浅层卷积网络输出的特征图属于低层特征,从低层特征图中可以看清轮廓、边缘等信息。

    2024年02月05日
    浏览(28)
  • 第55步 深度学习图像识别:CNN特征层和卷积核可视化(TensorFlow)

    一、写在前面 (1)CNN可视化 在理解和解释卷积神经网络(CNN)的行为方面,可视化工具起着重要的作用。以下是一些可以用于可视化的内容: (a)激活映射(Activation maps): 可以显示模型在训练过程中的激活情况,这可以帮助我们理解每一层(或每个过滤器)在识别图像

    2024年02月14日
    浏览(37)
  • 如何实现IM即时通信系统(一)

    在企业数字化建设过程中,如何与客户保持线上链接是重要的组成部分。而IM通信系统就属于数字化建设的基础设施。那么,如何实现一个符合企业需求的IM系统呢?采购当然是其中需要考虑的方式之一。但就我个人的经验来看,市面上好的IM厂商很稀少,因为IM厂商需要做标

    2024年02月10日
    浏览(54)
  • GEMM优化、并行优化、算子优化,从BLISlab项目入手! GEMM重要且典型

    BLISlab 是一个开源教学项目,提供了完整的代码范例和测试脚本教人如何一步步优化矩阵乘法。为此, 张先轶(中科院博士,OpenBLAS国际知名开源项目发起人) 录制了一个公开课系列,基于BLISlab项目给大家系统讲解GEMM优化。  视频三连发,您能不能也三连发?“点赞--转发

    2023年04月22日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包