如是我闻: 离散卷积(Discrete Convolution)是CNN中一个非常重要的操作。它是图像处理和特征提取的核心,用来从输入图像中提取不同的信息(如边缘、纹理等)。

在这里插入图片描述

1. 公式解析

离散卷积公式如下:
(x∗k)ij=∑p,qxi+p,j+q⋅kr−p,r−q (x * k)_{ij} = \sum_{p,q} x_{i+p, j+q} \cdot k_{r-p, r-q} (xk)ij=p,qxi+p,j+qkrp,rq

让我们来拆解它的含义:

(1) 输入
  • xxx:输入的图像,通常是一个二维矩阵。每个元素代表一个像素的值(灰度值或其他)。
  • kkk:卷积核(kernel),也是一个小矩阵,通常用于提取图像中的某些特征,比如边缘、角点等。
(2) 输出
  • (x∗k)ij(x * k)_{ij}(xk)ij:输出的卷积结果矩阵,对应图像 xxx 上某一点 (i,j)(i, j)(i,j)的卷积值。
  • 这个结果是通过将卷积核 kkk 放在图像 xxx 上滑动计算得到的。
(3) 核心计算
  • 公式的核心是:对于图像中的每个位置 (i,j)(i, j)(i,j),将卷积核 kkk 与图像对应区域的像素逐点相乘,然后求和。
  • p,qp, qp,q:用于枚举卷积核中的元素。
  • rrr:表示卷积核的中心点位置。

特别注意:公式中的 kr−p,r−qk_{r-p, r-q}krp,rq 表示对卷积核进行行和列的翻转,这是离散卷积的重要步骤。


2. 举例

让我们通过一个例子来理解公式的实际操作过程。

(1) 输入图像 xxx

假设图像 xxx 是一个 3×33 \times 33×3 的矩阵:
x=[10.5400.25000040] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040

(2) 卷积核 kkk

假设卷积核 (k) 是一个 2×22 \times 22×2 的矩阵:
k=[00.250.51] k = \begin{bmatrix} 0 & 0.25 \\ 0.5 & 1 \end{bmatrix} k=[00.50.251]

(3) 核的翻转

根据离散卷积的定义,需要将卷积核 kkk 翻转
k~=[10.50.250] \tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} k~=[10.250.50]

这一步的翻转操作是为了实现标准的卷积定义。翻转后再与图像做对齐计算。

(4) 卷积操作

将卷积核 k~\tilde{k}k~滑动到图像 xxx 上,逐点计算输出。我们会对每个位置的局部矩阵进行点积并求和:


3. 详细的计算步骤

假设卷积的输出是一个 2×22 \times 22×2 的矩阵,下面是每个位置的计算:

位置 (1,1) 的计算

将卷积核的左上角对齐图像的左上角(位置 (1,1)(1,1)(1,1)):

x=[10.5400.25000040] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040

对齐子矩阵=[10.50.250] \text{对齐子矩阵} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} 对齐子矩阵=[10.250.50]

k~=[10.50.250] \tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} k~=[10.250.50]

计算点积:
1×1+0.5×0.5+0.25×0.25+0×0=1+0.25+0.0625+0=1.3125 1 \times 1 + 0.5 \times 0.5 + 0.25 \times 0.25 + 0 \times 0 = 1 + 0.25 + 0.0625 + 0 = 1.3125 1×1+0.5×0.5+0.25×0.25+0×0=1+0.25+0.0625+0=1.3125


位置 (1,2) 的计算

将卷积核滑动到图像的右侧(位置 ((1,2))):
x=[10.5400.25000040] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040

对齐子矩阵=[0.54000] \text{对齐子矩阵} = \begin{bmatrix} 0.5 & 40 \\ 0 & 0 \end{bmatrix} 对齐子矩阵=[0.50400]

k~=[10.50.250] \tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} k~=[10.250.50]

计算点积:
1×0.5+0.5×40+0.25×0+0×0=0.5+20+0+0=20.5 1 \times 0.5 + 0.5 \times 40 + 0.25 \times 0 + 0 \times 0 = 0.5 + 20 + 0 + 0 = 20.5 1×0.5+0.5×40+0.25×0+0×0=0.5+20+0+0=20.5


位置 (2,1) 的计算

将卷积核滑动到图像的下一行(位置 (2,1)(2,1)(2,1)):
x=[10.5400.25000040] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040

对齐子矩阵=[0.250040] \text{对齐子矩阵} = \begin{bmatrix} 0.25 & 0 \\ 0 & 40 \end{bmatrix} 对齐子矩阵=[0.250040]
k~=[10.50.250] \tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} k~=[10.250.50]

计算点积:
1×0.25+0.5×0+0.25×0+0×40=0.25+0+0+0=0.25 1 \times 0.25 + 0.5 \times 0 + 0.25 \times 0 + 0 \times 40 = 0.25 + 0 + 0 + 0 = 0.25 1×0.25+0.5×0+0.25×0+0×40=0.25+0+0+0=0.25


位置 (2,2) 的计算

将卷积核滑动到图像的右下角(位置 ((2,2))):
x=[10.5400.25000040] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040

对齐子矩阵=[00400] \text{对齐子矩阵} = \begin{bmatrix} 0 & 0 \\ 40 & 0 \end{bmatrix} 对齐子矩阵=[04000]

k~=[10.50.250] \tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} k~=[10.250.50]

计算点积:
1×0+0.5×0+0.25×40+0×0=0+0+10+0=10 1 \times 0 + 0.5 \times 0 + 0.25 \times 40 + 0 \times 0 = 0 + 0 + 10 + 0 = 10 1×0+0.5×0+0.25×40+0×0=0+0+10+0=10


4. 输出结果

将以上计算结果整理成一个输出矩阵:
输出=[1.312520.50.2510] \text{输出} = \begin{bmatrix} 1.3125 & 20.5 \\ 0.25 & 10 \end{bmatrix} 输出=[1.31250.2520.510]


5. 总的来说

  • 离散卷积的本质是通过卷积核提取图像的局部特征
  • 核心步骤:
    1. 将卷积核翻转;
    2. 按位置滑动;
    3. 在每个位置计算局部点积;
    4. 输出一个新的矩阵作为特征图。

以上

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐