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。

  • 相关阅读:
    NYOJ926(概率)
    无根树转有根树
    Codeforces Round #304 C(Div. 2)(模拟)
    hdu5878(枚举,打表)
    求一个矩阵的逆矩阵(用伴随矩阵求)
    求n阶方阵的值(递归)
    setw()函数
    快速幂计算(整数快速幂/矩阵快速幂)
    全文检索
    发送邮件
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725278.html
Copyright © 2011-2022 走看看