zoukankan      html  css  js  c++  java
  • CNN中卷积运算转化成矩阵乘法的实现——img2col+GEMM大矩阵乘法

    img2col:将特征图image(3D)根据卷积核的尺寸按原图对应位置展开成行col(2D)。

    当卷积步长小于核边长时,img2col会造成特征图像素的重叠复制增加内存,但是依然是更有效率的。

    核矩阵:将每个卷积核展成一列,即核矩阵的高为k*k*C_{k}C_{k}为每个卷积核的通道数),宽为Num_{kernl}

    特征图矩阵:image2col的关键就是根据卷积步长卷积核的尺寸将featuremap(3D)按原图的位置依次转化成 由多个宽为k*k*C_{k}的行向量(col),这些col拼成了特征图矩阵。

    以下为乱写了。。。。。。

    假设原图为H1*W1*C,卷积核为k*k*C*Fn(Fn为卷积核数目)

    H*W个行向量(行向量维度为k*k*C),image矩阵维度为(H*W)*(k*k*C),然后将每个卷积核也展开成k*k*C的列向量,因此核矩阵的维度为(k*k*C)*Fn

    矩阵乘法后即为(H*W)*Fn,H*W为卷积后输出特征图的尺寸,Fn就是特征图的输出通道数。

    •  
    • 无论是pytorch还是tensorflow其都是接收一个batch的数据进行处理,因此其卷积运算的矩阵乘法实现也是一个batch一次运算的。而把输入图片input转换成矩阵的过程就是img2col。
    • 首先将filter展开为(filter_h * filter_w * in_channnel, out_channel)大小的2D矩阵
    • 如果按数学上的运算,则卷积读取内存是不连续的,会增加时间成本。因此才有了img2col,矩阵在内存中是一个连续的内存块。在matlab中img2col是将img每次卷积运算对应的patch展开成列向量。而在caffe中是将每个patch转换成行,本质上没区别。以下为tensorflow中的过程,类似matlab。

  • 相关阅读:
    2020年天梯赛补题报告
    补提报告...
    2020.11.14天梯赛练习*6 补题
    2020-11-08补题报告
    2020-10-30 — 补题报告
    10-24 补题
    2020.10.17天梯赛练习 和 16 号个人赛 补题报告
    elasticsearch DQL 有关表达式的设计
    tab键和空格键
    emacs配置python开发环境
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725278.html
Copyright © 2011-2022 走看看