城乡建设部门户网站,软件外包公司为什么不好,网站建设服务器和空间费,如何自建一个网站卷积运算是信号处理、图像处理以及深度学习中的核心操作之一。尤其在卷积神经网络#xff08;CNN#xff09;中#xff0c;卷积层通过可学习的滤波器自动提取图像的局部特征#xff0c;成为计算机视觉任务的基石。本文将从直观理解出发#xff0c;逐步深入到数学定义…卷积运算是信号处理、图像处理以及深度学习中的核心操作之一。尤其在卷积神经网络CNN中卷积层通过可学习的滤波器自动提取图像的局部特征成为计算机视觉任务的基石。本文将从直观理解出发逐步深入到数学定义并通过具体示例和 Python 代码演示卷积的完整计算过程。什么是卷积在工程和深度学习的实际应用中“卷积”通常指的是**互相关cross-correlation**操作将一个称为“卷积核”或“滤波器”的小矩阵在输入数据如图像上滑动在每个位置计算该局部区域与卷积核的逐元素乘积之和从而生成一个新的输出矩阵称为特征图。尽管严格数学意义上的卷积包含对核函数的翻转但在深度学习框架如 TensorFlow、PyTorch中为简化计算和提升特征提取能力通常省略翻转步骤。因此我们以下讨论的“卷积”实为互相关但沿用“卷积”这一通用术语。数学定义对于二维离散信号如灰度图像设输入为I∈RH×WI \in \mathbb{R}^{H \times W}I∈RH×W卷积核为K∈Rk×kK \in \mathbb{R}^{k \times k}K∈Rk×k则输出特征图OOO在位置(i,j)(i, j)(i,j)的值为O(i,j)∑m0k−1∑n0k−1I(im,jn)⋅K(m,n) O(i, j) \sum_{m0}^{k-1} \sum_{n0}^{k-1} I(i m, j n) \cdot K(m, n)O(i,j)m0∑k−1​n0∑k−1​I(im,jn)⋅K(m,n)其中iii和jjj的取值范围由步长stride和填充padding决定。若无填充且步长为 1则输出尺寸为(H−k1)×(W−k1)(H - k 1) \times (W - k 1)(H−k1)×(W−k1)。一个具体的卷积示例考虑以下 4×4 的输入图像其左侧为高亮度区域值为 1右侧为暗区值为 0中间存在明显的垂直边缘input_image[[1,1,1,0],[1,1,1,0],[1,1,1,0],[0,0,0,0]]使用一个经典的拉普拉斯型边缘检测卷积核kernel[[0,1,0],[1,-4,1],[0,1,0]]该核对平滑区域响应接近零而对强度突变即边缘产生显著非零响应。由于输入尺寸为 4×4卷积核为 3×3且不使用填充、步长为 1输出特征图尺寸为 2×2。卷积核将在输入上滑动四个位置左上、右上、左下、右下。逐位置计算1. 左上角输出位置 (0,0)覆盖区域1 1 1 1 1 1 1 1 1计算1⋅01⋅11⋅01⋅11⋅(−4)1⋅11⋅01⋅11⋅00 1·0 1·1 1·0 1·1 1·(-4) 1·1 1·0 1·1 1·0 01⋅01⋅11⋅01⋅11⋅(−4)1⋅11⋅01⋅11⋅002. 右上角输出位置 (0,1)覆盖区域1 1 0 1 1 0 1 1 0计算1⋅01⋅10⋅01⋅11⋅(−4)0⋅11⋅01⋅10⋅0−1 1·0 1·1 0·0 1·1 1·(-4) 0·1 1·0 1·1 0·0 -11⋅01⋅10⋅01⋅11⋅(−4)0⋅11⋅01⋅10⋅0−13. 左下角输出位置 (1,0)覆盖区域1 1 1 1 1 1 0 0 0计算1⋅01⋅11⋅01⋅11⋅(−4)1⋅10⋅00⋅10⋅0−1 1·0 1·1 1·0 1·1 1·(-4) 1·1 0·0 0·1 0·0 -11⋅01⋅11⋅01⋅11⋅(−4)1⋅10⋅00⋅10⋅0−14. 右下角输出位置 (1,1)覆盖区域1 1 0 1 1 0 0 0 0计算1⋅01⋅10⋅01⋅11⋅(−4)0⋅10⋅00⋅10⋅0−2 1·0 1·1 0·0 1·1 1·(-4) 0·1 0·0 0·1 0·0 -21⋅01⋅10⋅01⋅11⋅(−4)0⋅10⋅00⋅10⋅0−2最终输出特征图为[[ 0, -1], [-1, -2]]负值表示该位置存在从亮到暗的边缘符合预期。Python 实现纯 Python 实现以下代码实现了无填充、步长为 1 的二维卷积defconv2d_simple(input_img,kernel):input_h,input_wlen(input_img),len(input_img[0])kernel_h,kernel_wlen(kernel),len(kernel[0])out_hinput_h-kernel_h1out_winput_w-kernel_w1output[[0for_inrange(out_w)]for_inrange(out_h)]foriinrange(out_h):forjinrange(out_w):total0forkiinrange(kernel_h):forkjinrange(kernel_w):totalinput_img[iki][jkj]*kernel[ki][kj]output[i][j]totalreturnoutput input_image[[1,1,1,0],[1,1,1,0],[1,1,1,0],[0,0,0,0]]kernel[[0,1,0],[1,-4,1],[0,1,0]]resultconv2d_simple(input_image,kernel)forrowinresult:print(row)调用该函数即可得到上述结果。使用 NumPy 和 SciPy在实际项目中推荐使用高效库进行卷积计算importnumpyasnpfromscipy.signalimportcorrelate2d input_imgnp.array([[1,1,1,0],[1,1,1,0],[1,1,1,0],[0,0,0,0]])kernelnp.array([[0,1,0],[1,-4,1],[0,1,0]])outputcorrelate2d(input_img,kernel,modevalid)print(output)correlate2d执行的是互相关操作与深度学习中的卷积行为一致。modevalid表示不使用填充仅返回完全重叠部分的输出。关键参数说明步长Stride控制卷积核每次滑动的像素数。步长越大输出越小计算量越低。填充Padding在输入边界补零或其他值常用于保持输出尺寸与输入一致如padding kernel_size // 2。卷积核大小常见为 3×3 或 5×5影响感受野和特征提取能力。通道数彩色图像有 RGB 三个通道卷积核需匹配输入通道数并可输出任意数量的特征图。结语卷积运算通过局部加权求和的方式能够有效捕捉数据中的空间结构信息。从边缘检测到复杂纹理识别再到现代深度学习模型中的层次化特征学习卷积始终扮演着关键角色。理解其底层机制不仅有助于调试模型也为设计新型网络结构奠定基础。通过手动计算与代码实现的结合我们得以清晰地看到卷积如何一步步将原始像素转化为有意义的特征表示。这种“滑动窗口加权求和”的思想正是卷积强大表达能力的源泉。