面试官:给我讲一下卷积吧!

推荐直接网站在线阅读:aicoting.cn

卷积(Convolution)是深度学习中最核心、最常用的运算之一,尤其在图像处理、语音识别和自然语言处理中扮演着关键角色。它通过滑动窗口的方式提取局部特征,能够有效捕捉数据中的空间或时间结构,是卷积神经网络(CNN)的基础。

所有相关文档、源码示例、流程图与面试八股,我也将持续更新在AIHub,欢迎关注收藏!

卷积

卷积(Convolution)是深度学习中最核心、最常用的运算之一,尤其在图像处理、语音识别和自然语言处理中扮演着关键角色。它通过滑动窗口的方式提取局部特征,能够有效捕捉数据中的空间或时间结构,是卷积神经网络(CNN)的基础。

卷积的数学定义

在数学上,卷积是一种积分或求和运算,用于衡量一个函数在另一个函数上的重叠程度。

  • 连续形式: <math xmlns="http://www.w3.org/1998/Math/MathML"> ( f ∗ g ) ( t ) = ∫ − ∞ + ∞ f ( τ ) g ( t − τ )   d τ (f * g)(t) = \int_{-\infty}^{+\infty} f(\tau) g(t - \tau) \, d\tau </math>(f∗g)(t)=∫−∞+∞f(τ)g(t−τ)dτ
  • 离散形式(用于深度学习中的数值计算): <math xmlns="http://www.w3.org/1998/Math/MathML"> ( f ∗ g ) [ n ] = ∑ m = − ∞ + ∞ f [ m ]   g [ n − m ] (f * g)[n] = \sum_{m=-\infty}^{+\infty} f[m] \, g[n-m] </math>(f∗g)[n]=∑m=−∞+∞f[m]g[n−m]

其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> f f </math>f 表示输入信号, <math xmlns="http://www.w3.org/1998/Math/MathML"> g g </math>g 表示卷积核(或滤波器), <math xmlns="http://www.w3.org/1998/Math/MathML"> n n </math>n 表示位置。

在图像处理中,卷积一般是二维的: <math xmlns="http://www.w3.org/1998/Math/MathML"> ( F ∗ K ) ( i , j ) = ∑ m ∑ n F ( i + m , j + n )   K ( m , n ) (F * K)(i,j) = \sum_m \sum_n F(i+m, j+n) \, K(m,n) </math>(F∗K)(i,j)=∑m∑nF(i+m,j+n)K(m,n)

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> F F </math>F 是输入图像, <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K 是卷积核。

卷积的核心思想

  1. 局部感受野:卷积核只关注输入数据的一小部分区域(例如图像的一个小块),类似人眼视觉系统的局部观察。
  2. 权值共享:同一个卷积核在不同位置滑动时使用相同的参数,极大减少了模型参数数量。
  3. 平移不变性:卷积能在不同位置检测相同的模式,例如边缘、角点、纹理等特征。

卷积在图像中的操作

  • 卷积核 (Kernel/Filter):一个小矩阵,例如 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 × 3 3\times3 </math>3×3 或 <math xmlns="http://www.w3.org/1998/Math/MathML"> 5 × 5 5\times5 </math>5×5,用来提取特定特征。
  • 步幅 (Stride):卷积核每次移动的步长。步幅越大,输出特征图越小。
  • 填充 (Padding):为了不丢失边界信息,可以在输入周围补零。

例如,一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> 5 × 5 5\times5 </math>5×5 的图像与一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 × 3 3\times3 </math>3×3 卷积核做卷积,如果步幅为 1 且无填充,输出结果是一个 <math xmlns="http://www.w3.org/1998/Math/MathML"> 3 × 3 3\times3 </math>3×3 特征图。

卷积的作用

  • 低级特征提取:浅层卷积层通常检测边缘、纹理等简单特征。
  • 高级特征组合:深层卷积层将低级特征组合成复杂模式,如物体的局部结构甚至完整物体。
  • 降维与压缩:通过池化层结合卷积,可逐步减少数据维度,保留重要信息。

卷积的应用举例

边缘检测(Sobel 卷积核)

用于提取图像中的边缘:

  • 水平边缘检测核: <math xmlns="http://www.w3.org/1998/Math/MathML"> K x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] K_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} </math>Kx= −1−2−1000121
  • 垂直边缘检测核: <math xmlns="http://www.w3.org/1998/Math/MathML"> K y = [ − 1 − 2 − 1 0 0 0 1 2 1 ] K_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix} </math>Ky= −101−202−101

把这些卷积核应用到图像上,就能突出水平或垂直方向的边缘。

模糊(均值卷积核)

<math xmlns="http://www.w3.org/1998/Math/MathML"> K = 1 9 [ 1 1 1 1 1 1 1 1 1 ] K = \frac{1}{9} \begin{bmatrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \end{bmatrix} </math>K=91 111111111

对每个像素取邻域的平均值,实现平滑效果。

锐化(高通滤波器)

<math xmlns="http://www.w3.org/1998/Math/MathML"> K = [ 0 − 1 0 − 1 5 − 1 0 − 1 0 ] K = \begin{bmatrix} 0 & -1 & 0 \\ -1 & 5 & -1 \\ 0 & -1 & 0 \end{bmatrix} </math>K= 0−10−15−10−10

能增强图像细节,使边缘更加清晰。

下面我们用 PyTorch 实现卷积操作:

python 复制代码
I_xray = imread('image/xray_image.png')[::4,::4]
# make sure to copy, otherwise they reference the same memory (same variable)
I_xray_sharp = I_xray.copy()

im_size = I_xray.shape

#### your code starts ####
## step 1. create the kernel matrix
# kernel = np.array([[-1, -1, -1],
#                    [-1, 7, -1],
#                    [-1, -1, -1]])
kernel = np.array([[0, -1, 0],
                   [-1, 5, -1],
                   [0, -1, 0]])
## step 2 & 3. modify the median filter code for filtering
# 卷积核大小
psz_h = 1

# 使用块级操作进行锐化滤波
for row in range(psz_h, im_size[0] - psz_h):
    for col in range(psz_h, im_size[1] - psz_h):
        # 提取 3x3 的图像块
        patch = I_xray[row - psz_h: row + psz_h + 1, col - psz_h: col + psz_h + 1]
        # 进行卷积操作:元素乘积并求和
        I_xray_sharp[row, col] = np.sum(patch * kernel)

# 将值限制在 0 到 255 之间,防止溢出
I_xray_sharp = np.clip(I_xray_sharp, 0, 255).astype(np.uint8)

#### your code starts ####

plt.subplot(121)
plt.imshow(I_xray, cmap='gray');plt.axis('off');plt.title('original')
plt.subplot(122)
plt.imshow(I_xray_sharp, cmap='gray');plt.axis('off');plt.title('sharp')

运行结果如下,可以看到锐化效果还是很明显的

卷积的优势在于参数量远小于全连接网络,自然具备特征提取能力,适合处理高维数据(如图像、视频),但是卷积对全局依赖建模较弱,并且卷积核大小和设计需要人工选择,所以在 NLP 等任务中逐渐被 Transformer 替代。

卷积作为深度学习的基石,极大推动了神经网络在计算机视觉、语音识别和 NLP 中的成功。它以局部感知、权值共享和平移不变性为特征,使得神经网络能够高效处理高维结构化数据。虽然新的架构(如 Transformer)在部分领域崛起,但卷积依然是深度学习的重要基础算子。

📚推荐阅读

一文搞懂卷积神经网络!

面试官:正则化都有哪些经典的方法?

面试官:你在训模型的时候经常使用的学习率策略有哪些?

面试官:深度学习中经典的优化算法都有哪些?

一文搞懂深度学习中的通用逼近定理!

一文搞懂深度学习中的表征学习理论!

一文搞懂深度学习中的信息论!

一文搞懂深度学习的反向传播与优化理论!

最新的文章都在公众号aicoting更新,别忘记关注哦!

作者:aicoting

分享是一种信仰,连接让成长更有温度。

我们下次不见不散!

相关推荐
2401_831824962 小时前
高性能计算集群部署
开发语言·c++·算法
NAGNIP2 小时前
一文搞懂卷积神经网络!
算法·面试
菜鸟小九2 小时前
hot100(91-100)
数据结构·算法·排序算法
add45a2 小时前
C++代码移植性设计
开发语言·c++·算法
ccLianLian2 小时前
leetcode-hot100
算法·leetcode·职场和发展
qq_148115372 小时前
分布式系统容错设计
开发语言·c++·算法
m0_560396472 小时前
C++中的享元模式
开发语言·c++·算法
左左右右左右摇晃2 小时前
数据结构——数组
数据结构·笔记·算法
nainaire2 小时前
速通LeetCode hot100——(1~9 哈希,双指针,滑动窗口)
c++·笔记·算法·leetcode