卷积数学公式
时间: 2025-05-23 11:31:18 浏览: 14
### 卷积运算的数学定义
卷积是一种线性算子,在信号处理、图像处理以及机器学习领域有着广泛的应用。在离散形式下,二维卷积可以表示为:
\[
z_{ij} = \sum_{k}\sum_{l} w_{kl} x_{(i+k)(j+l)} + b
\]
其中 \(w\) 是卷积核权重矩阵,\(x\) 表示输入数据矩阵,\(b\) 是偏置项[^1]。
上述公式的含义是对输入矩阵 \(x\) 的每一个位置应用卷积核 \(w\) 进行加权求和,并加上偏置项 \(b\) 得到输出矩阵的一个元素值。这一过程可以通过滑动窗口的方式实现,即每次只计算当前窗口内的局部区域与卷积核之间的乘积累加结果。
---
### 前向传播公式推导
在卷积神经网络 (CNN) 中,前向传播的核心是通过卷积操作提取特征。设输入特征图为 \(X\),大小为 \(H \times W\);卷积核大小为 \(K_h \times K_w\),共有 \(C_o\) 个通道,则输出特征图 \(Y\) 可由如下公式描述:
\[
Y[i,j,c'] = \sum_{m=0}^{K_h-1} \sum_{n=0}^{K_w-1} X[(i+m),(j+n),c] \cdot W[m,n,c',c] + B[c']
\]
这里:
- \(W[m,n,c',c]\) 表示第 \(c'\) 个输出通道相对于第 \(c\) 个输入通道的卷积核;
- \(B[c']\) 是对应于第 \(c'\) 输出通道的偏置;
- 步长 \(S\) 和填充 \(P\) 影响最终输出尺寸[^4]。
如果考虑步长 \(S\) 和零填充 \(P\) 后,输出特征图的空间维度可通过以下公式计算:
\[
H' = \left\lfloor \frac{H + 2P - K_h}{S} \right\rfloor + 1,\quad W' = \left\lfloor \frac{W + 2P - K_w}{S} \right\rfloor + 1
\]
这表明输出特征图的大小取决于输入大小、卷积核大小、步长和填充方式。
---
### 反向传播公式推导
反向传播的目标是最小化损失函数 \(E\) 对模型参数的影响。具体来说,需要分别计算关于输入 \(X\)、卷积核 \(W\) 和偏置 \(B\) 的梯度。
#### 关于输入 \(X\) 的梯度 (\(\partial E / \partial X\))
利用链式法则,可得:
\[
\frac{\partial E}{\partial X[i,j,c]} = \sum_{m=0}^{K_h-1} \sum_{n=0}^{K_w-1} \sum_{c'=0}^{C_o-1} \delta_X[(i-m),(j-n),c'] \cdot W[m,n,c',c]
\]
这里的 \(\delta_X\) 实际上是由后续层传递回来的误差项经过转置卷积(或称为反卷积)计算得到的结果[^2]。
#### 关于卷积核 \(W\) 的梯度 (\(\partial E / \partial W\))
同样基于链式法则有:
\[
\frac{\partial E}{\partial W[m,n,c',c]} = \sum_{i=0}^{H'-1} \sum_{j=0}^{W'-1} \delta_Y[i,j,c'] \cdot X[(i+m),(j+n),c]
\]
此处 \(\delta_Y\) 表示来自更高一层传回的误差项。
#### 关于偏置 \(B\) 的梯度 (\(\partial E / \partial B\))
因为每个输出通道共享同一个偏置,故其更新规则简单明了:
\[
\frac{\partial E}{\partial B[c']} = \sum_{i=0}^{H'-1} \sum_{j=0}^{W'-1} \delta_Y[i,j,c']
\]
以上三部分共同构成了完整的反向传播算法框架[^3]。
---
### 应用实例
以下是 Python 实现简单的卷积操作代码片段:
```python
import numpy as np
def convolve(input_data, kernel, bias, stride=(1, 1)):
input_height, input_width = input_data.shape[:2]
kernel_size = kernel.shape[0]
output_height = int((input_height - kernel_size) / stride[0]) + 1
output_width = int((input_width - kernel_size) / stride[1]) + 1
result = np.zeros((output_height, output_width))
for i in range(output_height):
for j in range(output_width):
patch = input_data[i*stride[0]:i*stride[0]+kernel_size,
j*stride[1]:j*stride[1]+kernel_size]
result[i][j] = np.sum(patch * kernel) + bias
return result
```
此代码实现了基本的二维卷积功能,适用于单通道灰度图片的情况。
---
阅读全文
相关推荐


















