将卷积运算转为矩阵相乘

给定一个卷积层 C in * C out * H k * W k,  以及输入 feature map C in * H * W,我们希望将该卷积操作转化为一次矩阵乘,以便使用一些矩阵计算优化策略,请设计转换方法。

img2col
Mat A: (H * W) * (Cin *  Hk * Wk )
Mat B: (Cin *  Hk * Wk )* (Cout )

MATLAB中函数image2col可以实现这个功能,具体的原理如下

 上图为3D卷积的传统计算方式与矩阵乘法计算方式的对比,传统卷积运算是将卷积核以滑动窗口的方式在输入图上滑动,当前窗口内对应元素相乘然后求和得到结果,一个窗口一个结果。相乘然后求和恰好也是向量内积的计算方式,所以可以将每个窗口内的元素拉成向量,通过向量内积进行运算,多个窗口的向量放在一起就成了矩阵,每个卷积核也拉成向量,多个卷积核的向量排在一起也成了矩阵,于是,卷积运算转化成了矩阵运算。

下图为转化后的矩阵尺寸,padding为0:

 优缺点分析

将卷积运算转化为矩阵乘法,从乘法和加法的运算次数上看,两者没什么差别,但是转化成矩阵后,运算时需要的数据被存在连续的内存上,这样访问速度大大提升(cache),同时,矩阵乘法有很多库提供了高效的实现方法,像BLAS、MKL等,转化成矩阵运算后可以通过这些库进行加速。

缺点呢?这是一种空间换时间的方法,消耗了更多的内存——转化的过程中数据被冗余存储。

转自 https://www.cnblogs.com/shine-lee/p/10775831.html

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
矩阵卷积运算是一种常见的图像处理和机器学习中的数学运算,用于对输入数据进行特征提取和处理。它是基于滤波器(也称为卷积核或卷积矩阵)与输入矩阵之间的乘法运算来实现的。 具体来说,假设我们有一个 $m \times n$ 的输入矩阵 $A$,以及一个 $k \times k$ 的滤波器 $B$。那么,我们可以通过如下的方式将滤波器 $B$ 应用到输入矩阵 $A$ 上: 1. 将滤波器 $B$ 按照中心对称的方式放置在输入矩阵 $A$ 的某个位置上,比如左上角。 2. 将滤波器 $B$ 中的每个元素与与其对应的输入矩阵 $A$ 中的元素相乘,然后将它们相加得到一个标量值。 3. 将这个标量值作为输出矩阵 $C$ 中对应位置的值。 这个过程可以看做是一个对输入矩阵 $A$ 的滑动窗口操作,即将滤波器 $B$ 沿着输入矩阵 $A$ 滑动,每次在当前位置上进行乘法运算和求和操作,得到输出矩阵 $C$ 中对应位置的值。 在这个过程中,输入矩阵 $A$ 和滤波器 $B$ 的维度需要满足一定的条件,例如输入矩阵 $A$ 的通道数(即矩阵的深度)需要与滤波器 $B$ 的通道数相等,这样才能进行矩阵乘法运算。此外,卷积运算通常还包括一些额外的步骤,如填充和步幅等,用于控制输出矩阵 $C$ 的大小和形状。 总之,矩阵卷积运算是图像处理和机器学习中一个重要的数学工具,可以用于对输入数据进行特征提取和处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值