如何计算矩阵的卷积

本文深入探讨了深度学习中核心组件卷积神经网络的卷积运算原理,特别关注图像边缘检测应用。通过解析矩阵卷积运算的过程与MATLAB的不同计数方式,以及在不同卷积模式(valid、same、full)下的计算结果展示,旨在为读者提供全面理解卷积运算的指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天立下flag,要开始学习深度学习,深度学习中十分重要的就是卷积神经网络,顾名思义,卷积神经网络中一定会用到卷积。喵哥在博友的一篇博文中看到卷积运算用于图像边缘检测的应用实例,博友十分细心的在截图上做了卷积的运算过程,手动点赞。喵哥最近在看傅里叶变换(连续),对卷积还算记得起一点,但是对图像这种矩阵的卷积运算,的确是没有太多影响,本科学的图像处理的课程真是全部还给老师了。本着勤奋好学的理念,在网上搜了几篇关于矩阵卷积运算的介绍,收获颇丰。但是在看教程时也发现一些小错误和容易引起误会的地方,所以写下这篇博文作为一个日后复习的好去处。

设有矩阵A,B,两者之间的卷积结果可以用公式:

                                      c(j,k) = \sum_{p=-\infty }^{\infty }\sum_{q=-\infty }^{\infty }A(p,q)B(j-p+1,k-q+1)

表示。以上公式表示的是从0开始计数,这不同于MATLAB的从1开始计数,所以公式与MATLAB提供的卷积公式稍有形式上的差异。同一维的数据卷积一样——把卷积模板翻转180°,然后从上至下,从左到右滑动模板,然后计算模板与原始图像交集元素的乘积和,得到的即是卷积后的数值。

假设B是模板,A是原始图像,那么用一组矩形相交关系来表示A,B移动的状态。

1. 两个矩形没有交集

 

2.两个矩形在大矩形的左边相交

 

3. 两个矩形在大矩形上面相交

 

4. 小矩形交于大矩形的左上角

 

5. 小矩形包含于大矩形内部

 

6. 小矩形交于大矩形的右上角

 

7. 小矩形交于大矩形右边

 

8. 小矩形交于大矩形的左下角

 

9. 小矩形交于大矩形的下方

 

10.小矩形交于大矩形的右下

 

这些相交方式的一些集合就构成了各种卷积定义的运算模式。在MATLAB中有三种二维的矩阵卷积定义:valid、same和full。MATLAB对他们的解释为:

'valid'
Returns only those parts of the convolution that are computed without the zero-padded edges. Using this option, size(C) = max([ma-max(0,mb-1),na-max(0,nb-1)],0).

'same'
Returns the central part of the convolution of the same size as A.

'full'
Returns the full two-dimensional convolution (default).

假设A = \begin{bmatrix} 1 & 2 & 3 & 4 & 5 &6 \\ 2 & 3&4 & 5& 6 &7 \\ 3& 4&5 & 6 &7 &8 \\ 4& 5 & 6& 7 &8 &9 \\ 5 &6 &7 & 8& 9 &10 \\ 6& 7& 8&9 & 10& 11 \end{bmatrix}B = \begin{bmatrix} 1 & 2&3 \\ 4 &5 & 6\\ 7& 8& 9 \end{bmatrix}

在计算卷积A*B时,需要先把B做翻转,得到

B\star = \begin{bmatrix} 9 & 8 & 7\\ 6 & 5 &4 \\ 3 &2 &1 \end{bmatrix},然后把这个翻转的矩阵在大矩阵A中移动。

valid型卷积

valid类型的卷积只考虑B包含于A的情况(即情况5),在矩阵A外围完全不需要补0。若B移动的步长是1,最终的卷积结果的矩阵大小为nc(A) - nc(B) + 1,nc(A),nc(B)分别为A,B矩阵的边长。

1*92*83*7456
2*63*54*4567
3*34*25*1678
456789
5678910
67891011

 

第一个重叠区域的乘积计算,得到的值是111,依次计算得到的卷积矩阵为

                                                                            \begin{bmatrix} 111 & 156 & 201& 246\\ 156& 201& 246& 291\\ 201 &246 & 291& 336\\ 246& 291&336 & 381 \end{bmatrix}

same型卷积

这个类型的卷积在valid的基础上,还要包含小矩阵交于大矩阵的右边缘、下边缘以及右下角重叠的情况(7,9,10)。给A矩阵的右边缘和下边缘补0,这样计算出卷积的矩阵与矩阵A的大小一致。

                                                                    \begin{bmatrix} 20 &44 &65 & 86 &107 &92 \\ 54 &111 &156 &201 &246 &201 \\ 81 & 156 & 201 & 291 & 336 &267 \\ 108& 201& 246 & 291& 336& 267\\ 135 & 246& 291 & 336& 381& 300\\ 140& 245& 284 & 323 & 362 & 276 \end{bmatrix}

full型卷积

这是包含所有重叠情况的卷积类型,即除了第一种分离状态的所有情况,需要在A矩阵四周补0。这样得出的卷积矩阵比A矩阵长2个元素。

full

 

 

<think>嗯,用户想了解矩阵卷积计算方法或实现。首先,我得回忆一下矩阵卷积的基本概念。卷积在图像处理中很常见,比如边缘检测或者模糊效果。那矩阵卷积具体是怎么操作的呢?记得需要输入矩阵和一个卷积核,然后通过滑动窗口的方式计算每个位置的加权和。 根据用户提供的引用,特别是引用[1]里提到,输入矩阵通常是图像像素,卷积核用于特征提取。那步骤应该是输入矩阵卷积核和输出矩阵的关系。然后引用[2]和[3]提到了将卷积转换为矩阵乘法的方法,这可能是一种优化手段。 首先,我得解释基础的手动计算方法。比如,如何滑动卷积核,计算每个位置的元素乘积之和。这部分需要举例说明,可能用一个3x3的输入矩阵和一个2x2的卷积核,演示计算过程。然后,再提到边缘填充的问题,比如零填充或者镜像填充,不同的填充方式会影响输出矩阵的大小。 接下来,用户可能需要知道代码实现。这时候Python的例子比较直观,可以用嵌套循环遍历每个位置,然后计算卷积值。不过这样的实现效率不高,但对于理解原理有帮助。同时,可以提到实际应用中会使用优化方法,比如转换为矩阵乘法,如引用[2]所说,将输入矩阵的每个patch铺平成行,卷积核铺平成列,然后做矩阵乘法得到结果。 另外,引用[3]提到转换矩阵乘法是优化手段之一,但像深度可分离卷积可能不需要这样处理。这里可能需要简要说明不同场景下的优化选择。 用户可能的问题会涉及实现中的细节,比如步长、填充方式、多通道处理等。因此,在回答时要覆盖这些参数的影响,并给出代码示例中的相关注释。例如,步长设置为1,填充为零,这样输出矩阵的大小会变化。 还要注意区分不同层的实现,比如在深度学习框架中,卷积可能有更高效的实现,比如im2col操作,将输入转换为大的矩阵,从而利用高效的矩阵乘法库。这部分可以结合引用[2]中的铺平方法来说明。 最后,生成相关问题时要考虑用户可能进一步的问题,比如性能优化、不同填充方式的区别、多通道卷积如何处理,以及实际应用中的例子,比如边缘检测的卷积核是什么样的。 总结一下,回答需要分步骤,从基础的手动计算到代码示例,再到优化方法,同时引用提供的资料来支持每个部分的解释。</think>### 矩阵卷积计算的方法与实现 矩阵卷积是图像处理和深度学习中的核心操作,其核心思想是通过滑动窗口对输入矩阵进行局部加权求和。以下是具体实现方法的分步说明: --- #### **一、手动计算步骤(基础方法)** 1. **输入矩阵卷积核定义** - 输入矩阵:$I_{m \times n}$(例如图像像素矩阵) - 卷积核:$K_{k \times k}$(例如边缘检测核) 2. **滑动窗口计算** 从输入矩阵左上角开始,以固定步长(通常为1)滑动卷积核。每个位置的输出值为: $$O(i,j) = \sum_{u=0}^{k-1} \sum_{v=0}^{k-1} I(i+u, j+v) \cdot K(u,v)$$ 其中,$i,j$ 为输出矩阵坐标,需满足 $0 \le i \le m-k$, $0 \le j \le n-k$[^1]。 3. **边缘填充处理** 若需保持输出尺寸与输入一致,需在输入矩阵外围填充0或其他值(如镜像填充)。例如,零填充后输入矩阵尺寸变为 $(m+2p) \times (n+2p)$,其中 $p$ 为填充层数。 **示例**: 输入矩阵 $\begin{bmatrix}1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9\end{bmatrix}$,卷积核 $\begin{bmatrix}-1 & 0 \\ 0 & 1\end{bmatrix}$ 输出第一个元素:$1\cdot(-1) + 2\cdot0 + 4\cdot0 + 5\cdot1 = 4$。 --- #### **二、代码实现(Python示例)** ```python def matrix_convolution(input_matrix, kernel, stride=1, padding=0): # 添加零填充 if padding > 0: input_matrix = np.pad(input_matrix, padding, mode='constant') m, n = input_matrix.shape k = kernel.shape[0] output_size = (m - k + 2 * padding) // stride + 1 output = np.zeros((output_size, output_size)) for i in range(0, output_size): for j in range(0, output_size): # 提取当前窗口区域 window = input_matrix[i*stride:i*stride+k, j*stride:j*stride+k] output[i, j] = np.sum(window * kernel) return output ``` --- #### **三、优化方法:矩阵乘法实现** 将卷积操作转换为矩阵乘法可提升计算效率(如GPU加速)[^2]: 1. **输入矩阵展开** 将输入矩阵的每个局部窗口(patch)按行展开为向量,并组合成矩阵 $M$。 2. **卷积核展开** 将卷积核按列展开为向量 $K_{flat}$。 3. **矩阵乘法计算** 输出结果通过 $M \cdot K_{flat}$ 得到,最后还原为矩阵形式。 **示意图**: 输入矩阵的展开与卷积核乘法: $$M = \begin{bmatrix}\text{patch}_1 \\ \text{patch}_2 \\ \vdots\end{bmatrix}, \quad O = M \cdot K_{flat}$$ 该方法常用于深度学习框架(如TensorFlow/PyTorch)的im2col操作[^3]。 --- #### **四、关键参数与注意事项** 1. **步长(Stride)**:步长越大,输出尺寸越小。 2. **填充(Padding)**:零填充保持尺寸,有效填充避免边缘信息丢失。 3. **多通道处理**:若输入为多通道(如RGB图像),需对每个通道独立卷积后求和。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值