卷积神经网络 卷积操作公式
时间: 2025-06-30 21:36:07 浏览: 17
### 卷积神经网络中卷积操作的数学公式推导
卷积神经网络(CNN)的核心在于其卷积操作,该操作通过滑动窗口的方式提取特征。以下是卷积操作的具体数学描述及其推导过程。
#### 输入与卷积核定义
假设输入数据 \(X\) 是一个三维张量,形状为 \((H_{in}, W_{in}, C_{in})\),其中 \(H_{in}\) 和 \(W_{in}\) 分别表示高度和宽度,\(C_{in}\) 表示通道数。
卷积核 \(K\) 也是一个四维张量,形状为 \((N_f, H_k, W_k, C_{in})\),其中 \(N_f\) 是滤波器的数量,\(H_k\) 和 \(W_k\) 是卷积核的高度和宽度,\(C_{in}\) 对应输入的通道数[^4]。
#### 输出计算
对于每个滤波器 \(f\) (\(0 \leq f < N_f\)),输出特征图的一个位置可以通过以下公式计算:
\[
Y[f][i,j] = \varphi\left(\sum_{c=0}^{C_{in}-1} \sum_{m=0}^{H_k-1} \sum_{n=0}^{W_k-1} K[f][m,n,c] \cdot X[i+m, j+n, c] + b[f]\right)
\]
其中:
- \(Y[f][i,j]\) 表示第 \(f\) 个滤波器在输出特征图上的位置 \((i,j)\) 处的值;
- \(K[f][m,n,c]\) 表示第 \(f\) 个滤波器在位置 \((m,n)\) 上针对第 \(c\) 个通道的权重;
- \(b[f]\) 是第 \(f\) 个滤波器对应的偏置项;
- \(\varphi(x)\) 是激活函数,通常采用 ReLU 函数或其他非线性变换[^3]。
#### 特征图尺寸计算
如果步幅(stride)设为 \(S\),填充(padding)设为 \(P\),则输出特征图的大小可由以下公式决定:
\[
H_{out} = \lfloor \frac{H_{in} + 2P - H_k}{S} \rfloor + 1,\quad W_{out} = \lfloor \frac{W_{in} + 2P - W_k}{S} \rfloor + 1
\]
这里,\(\lfloor x \rfloor\) 表示向下取整操作。
#### 梯度计算
为了更新卷积核参数,在反向传播过程中需要计算损失函数相对于卷积核的梯度。具体而言,卷积核的梯度可通过如下公式得到:
\[
\frac{\partial L}{\partial K[f]} = \text{Conv}(D_Y[f], R(X))
\]
其中:
- \(L\) 是总损失;
- \(D_Y[f]\) 是当前层误差相对于输出特征图的梯度;
- \(R(X)\) 是旋转后的输入张量(通常是翻转 180 度)。
---
### 示例代码实现
以下是一个简单的 Python 实现来展示上述公式的应用:
```python
import numpy as np
def convolve(input_data, kernel, bias, stride=1, padding=0):
"""
执行二维卷积操作。
参数:
input_data: 输入张量 (height, width, channels)
kernel: 卷积核 (kernel_height, kernel_width, channels)
bias: 偏置标量
stride: 步幅,默认为1
padding: 边界填充,默认为0
返回:
output_feature_map: 卷积结果
"""
h_in, w_in, c_in = input_data.shape
k_h, k_w, _ = kernel.shape
# 添加边界填充
padded_input = np.pad(
input_data,
((padding, padding), (padding, padding), (0, 0)),
'constant'
)
# 计算输出尺寸
out_h = int(((h_in + 2 * padding - k_h) / stride) + 1)
out_w = int(((w_in + 2 * padding - k_w) / stride) + 1)
output_feature_map = np.zeros((out_h, out_w))
for i in range(out_h):
for j in range(out_w):
patch = padded_input[i*stride:i*stride+k_h, j*stride:j*stride+k_w, :]
output_feature_map[i, j] = np.sum(patch * kernel) + bias
return output_feature_map
# 测试案例
input_tensor = np.random.rand(5, 5, 3) # 输入张量
conv_kernel = np.random.rand(3, 3, 3) # 卷积核
bias_value = 0.1 # 偏置
output = convolve(input_tensor, conv_kernel, bias_value)
print(output)
```
---
阅读全文
相关推荐


















