深度学习|表示学习|卷积神经网络|离散卷积的操作详细|10
如是我闻: 离散卷积(Discrete Convolution)是CNN中一个非常重要的操作。它是图像处理和特征提取的核心,用来从输入图像中提取不同的信息(如边缘、纹理等)。
1. 公式解析
离散卷积公式如下:
(
x
∗
k
)
i
j
=
∑
p
,
q
x
i
+
p
,
j
+
q
⋅
k
r
−
p
,
r
−
q
(x * k)_{ij} = \sum_{p,q} x_{i+p, j+q} \cdot k_{r-p, r-q}
(x∗k)ij=p,q∑xi+p,j+q⋅kr−p,r−q
让我们来拆解它的含义:
(1) 输入
- x x x:输入的图像,通常是一个二维矩阵。每个元素代表一个像素的值(灰度值或其他)。
- k k k:卷积核(kernel),也是一个小矩阵,通常用于提取图像中的某些特征,比如边缘、角点等。
(2) 输出
- ( x ∗ k ) i j (x * k)_{ij} (x∗k)ij:输出的卷积结果矩阵,对应图像 x x x 上某一点 ( i , j ) (i, j) (i,j)的卷积值。
- 这个结果是通过将卷积核 k k k 放在图像 x x x 上滑动计算得到的。
(3) 核心计算
- 公式的核心是:对于图像中的每个位置 ( i , j ) (i, j) (i,j),将卷积核 k k k 与图像对应区域的像素逐点相乘,然后求和。
- p , q p, q p,q:用于枚举卷积核中的元素。
- r r r:表示卷积核的中心点位置。
特别注意:公式中的 k r − p , r − q k_{r-p, r-q} kr−p,r−q 表示对卷积核进行行和列的翻转,这是离散卷积的重要步骤。
2. 举例
让我们通过一个例子来理解公式的实际操作过程。
(1) 输入图像 x x x
假设图像
x
x
x 是一个
3
×
3
3 \times 3
3×3 的矩阵:
x
=
[
1
0.5
40
0.25
0
0
0
0
40
]
x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix}
x=
10.2500.50040040
(2) 卷积核 k k k
假设卷积核 (k) 是一个
2
×
2
2 \times 2
2×2 的矩阵:
k
=
[
0
0.25
0.5
1
]
k = \begin{bmatrix} 0 & 0.25 \\ 0.5 & 1 \end{bmatrix}
k=[00.50.251]
(3) 核的翻转
根据离散卷积的定义,需要将卷积核
k
k
k 翻转:
k
~
=
[
1
0.5
0.25
0
]
\tilde{k} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix}
k~=[10.250.50]
这一步的翻转操作是为了实现标准的卷积定义。翻转后再与图像做对齐计算。
(4) 卷积操作
将卷积核 k ~ \tilde{k} k~滑动到图像 x x x 上,逐点计算输出。我们会对每个位置的局部矩阵进行点积并求和:
3. 详细的计算步骤
假设卷积的输出是一个 2 × 2 2 \times 2 2×2 的矩阵,下面是每个位置的计算:
位置 (1,1) 的计算
将卷积核的左上角对齐图像的左上角(位置 ( 1 , 1 ) (1,1) (1,1)):
x = [ 1 0.5 40 0.25 0 0 0 0 40 ] x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix} x= 10.2500.50040040
对齐子矩阵 = [ 1 0.5 0.25 0 ] \text{对齐子矩阵} = \begin{bmatrix} 1 & 0.5 \\ 0.25 & 0 \end{bmatrix} 对齐子矩阵=[10.250.50]
k ~ = [ 1 0.5 0.25 0 ] \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
=
[
1
0.5
40
0.25
0
0
0
0
40
]
x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix}
x=
10.2500.50040040
对齐子矩阵 = [ 0.5 40 0 0 ] \text{对齐子矩阵} = \begin{bmatrix} 0.5 & 40 \\ 0 & 0 \end{bmatrix} 对齐子矩阵=[0.50400]
k ~ = [ 1 0.5 0.25 0 ] \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
=
[
1
0.5
40
0.25
0
0
0
0
40
]
x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix}
x=
10.2500.50040040
对齐子矩阵
=
[
0.25
0
0
40
]
\text{对齐子矩阵} = \begin{bmatrix} 0.25 & 0 \\ 0 & 40 \end{bmatrix}
对齐子矩阵=[0.250040]
k
~
=
[
1
0.5
0.25
0
]
\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
=
[
1
0.5
40
0.25
0
0
0
0
40
]
x = \begin{bmatrix} 1 & 0.5 & 40 \\ 0.25 & 0 & 0 \\ 0 & 0 & 40 \end{bmatrix}
x=
10.2500.50040040
对齐子矩阵 = [ 0 0 40 0 ] \text{对齐子矩阵} = \begin{bmatrix} 0 & 0 \\ 40 & 0 \end{bmatrix} 对齐子矩阵=[04000]
k ~ = [ 1 0.5 0.25 0 ] \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.3125
20.5
0.25
10
]
\text{输出} = \begin{bmatrix} 1.3125 & 20.5 \\ 0.25 & 10 \end{bmatrix}
输出=[1.31250.2520.510]
5. 总的来说
- 离散卷积的本质是通过卷积核提取图像的局部特征。
- 核心步骤:
- 将卷积核翻转;
- 按位置滑动;
- 在每个位置计算局部点积;
- 输出一个新的矩阵作为特征图。
以上