【CNN算法理解】:卷积神经网络 (CNN) 数值计算与传播机制

文章目录

实验设置与数据定义

输入数据 (7×7 单通道)

假设输入为单通道7×7矩阵,无填充,步长=1:

复制代码
X = [
  [1, 2, 3, 4, 5, 6, 7],
  [8, 9, 10, 11, 12, 13, 14],
  [15, 16, 17, 18, 19, 20, 21],
  [22, 23, 24, 25, 26, 27, 28],
  [29, 30, 31, 32, 33, 34, 35],
  [36, 37, 38, 39, 40, 41, 42],
  [43, 44, 45, 46, 47, 48, 49]
]

输入形状:(1, 7, 7) = (通道数, 高度, 宽度)

卷积核定义 (3个3×3核)

复制代码
K1 = [[1, 0, -1],  # 垂直边缘检测
      [1, 0, -1],
      [1, 0, -1]]
      
K2 = [[1, 1, 1],   # 水平边缘检测  
      [0, 0, 0],
      [-1, -1, -1]]
      
K3 = [[0, -1, 0],  # 锐化效果
      [-1, 5, -1],
      [0, -1, 0]]

偏置:b1 = 0.1, b2 = 0.2, b3 = 0.3


第一部分:前向传播详细计算

1. 卷积层计算

卷积输出尺寸公式:输出尺寸 = ⌊(输入尺寸 - 核尺寸)/步长⌋ + 1 = ⌊(7-3)/1⌋ + 1 = 5

输出形状:(3, 5, 5) = (卷积核数, 高度, 宽度)

卷积核K1计算示例 (第1个输出神经元)

输入窗口位置(0,0):X[0:3, 0:3]K1点积

复制代码
窗口 = [[1, 2, 3],
        [8, 9, 10],
        [15, 16, 17]]
        
计算:1×1 + 2×0 + 3×(-1) + 8×1 + 9×0 + 10×(-1) + 15×1 + 16×0 + 17×(-1) + b1
     = 1 - 3 + 8 - 10 + 15 - 17 + 0.1
     = -5.9
K1完整输出特征图 (5×5)
复制代码
C1 = [
  [-5.9, -5.9, -5.9, -5.9, -5.9],
  [-5.9, -5.9, -5.9, -5.9, -5.9], 
  [-5.9, -5.9, -5.9, -5.9, -5.9],
  [-5.9, -5.9, -5.9, -5.9, -5.9],
  [-5.9, -5.9, -5.9, -5.9, -5.9]
]

注意:实际不同位置值不同,这里为简化显示为相同

三个卷积核完整输出
复制代码
C1 = [...]  # 5×5 来自K1
C2 = [...]  # 5×5 来自K2  
C3 = [...]  # 5×5 来自K3

2. ReLU激活函数

ReLU(x) = max(0, x)

假设C1的(0,0)位置值为-5.9,则:

复制代码
A1 = ReLU(C1) = max(0, -5.9) = 0

对所有位置应用ReLU:

复制代码
A1 = ReLU(C1)  # 5×5
A2 = ReLU(C2)  # 5×5
A3 = ReLU(C3)  # 5×5

3. 最大池化层 (2×2窗口,步长=2)

池化输出尺寸:⌊(5-2)/2⌋ + 1 = 2

输出形状:(3, 2, 2) = (特征图数, 高度, 宽度)

池化计算示例 (A1的左上2×2区域)

假设A1左上4个值:

复制代码
[[0, 3.2],
 [1.5, 2.1]]

最大池化:max(0, 3.2, 1.5, 2.1) = 3.2

池化后三个特征图
复制代码
P1 = [[3.2, 4.1],   # 来自A1
      [2.8, 3.9]]
      
P2 = [[1.5, 2.3],   # 来自A2  
      [0.9, 1.8]]
      
P3 = [[5.6, 4.7],   # 来自A3
      [6.2, 5.1]]

4. 展平层

(3, 2, 2)展平为12维向量:

复制代码
Flatten = [3.2, 4.1, 2.8, 3.9, 1.5, 2.3, 0.9, 1.8, 5.6, 4.7, 6.2, 5.1]

5. 全连接层 (假设连接到2个输出神经元)

权重矩阵W (12×2) 和偏置b (2):

复制代码
W = [[0.1, 0.2], [0.3, 0.4], [0.5, 0.6], [0.7, 0.8],
     [0.9, 1.0], [1.1, 1.2], [1.3, 1.4], [1.5, 1.6],
     [1.7, 1.8], [1.9, 2.0], [2.1, 2.2], [2.3, 2.4]]
     
b = [0.5, 0.6]

计算第1个输出神经元:

复制代码
z1 = 3.2×0.1 + 4.1×0.3 + 2.8×0.5 + 3.9×0.7 + 
     1.5×0.9 + 2.3×1.1 + 0.9×1.3 + 1.8×1.5 +
     5.6×1.7 + 4.7×1.9 + 6.2×2.1 + 5.1×2.3 + 0.5
   = 0.32 + 1.23 + 1.4 + 2.73 + 1.35 + 2.53 + 1.17 + 2.7 + 9.52 + 8.93 + 13.02 + 11.73 + 0.5
   = 57.33

计算第2个输出神经元:

复制代码
z2 = 3.2×0.2 + 4.1×0.4 + 2.8×0.6 + 3.9×0.8 +
     1.5×1.0 + 2.3×1.2 + 0.9×1.4 + 1.8×1.6 +
     5.6×1.8 + 4.7×2.0 + 6.2×2.2 + 5.1×2.4 + 0.6
   = 0.64 + 1.64 + 1.68 + 3.12 + 1.5 + 2.76 + 1.26 + 2.88 + 10.08 + 9.4 + 13.64 + 12.24 + 0.6
   = 61.44

全连接层输出:Z = [57.33, 61.44]

6. Softmax输出层

计算概率:

复制代码
exp_z1 = exp(57.33) ≈ 8.2e24
exp_z2 = exp(61.44) ≈ 4.6e26
sum_exp = 8.2e24 + 4.6e26 ≈ 4.682e26

P1 = 8.2e24 / 4.682e26 ≈ 0.0175 (1.75%)
P2 = 4.6e26 / 4.682e26 ≈ 0.9825 (98.25%)

最终输出:[0.0175, 0.9825],预测为第2类


第二部分:反向传播计算逻辑

1. 损失函数 (交叉熵损失)

假设真实标签y=1 (第2类),预测概率P=[0.0175, 0.9825]

损失函数: L = − Σ y i ⋅ l o g ( P i ) L = -Σ y_i·log(P_i) L=−Σyi⋅log(Pi)

复制代码
L = -[0×log(0.0175) + 1×log(0.9825)] 
  = -log(0.9825) 
  ≈ 0.0177

2. Softmax层反向传播

Softmax梯度公式: ∂ L / ∂ z i = P i − y i ∂L/∂z_i = P_i - y_i ∂L/∂zi=Pi−yi

对于i=1 (第1类):

∂ L / ∂ z 1 = P 1 − y 1 = 0.0175 − 0 = 0.0175 ∂L/∂z1 = P1 - y1 = 0.0175 - 0 = 0.0175 ∂L/∂z1=P1−y1=0.0175−0=0.0175

对于i=2 (第2类):

∂ L / ∂ z 2 = P 2 − y 2 = 0.9825 − 1 = − 0.0175 ∂L/∂z2 = P2 - y2 = 0.9825 - 1 = -0.0175 ∂L/∂z2=P2−y2=0.9825−1=−0.0175

Softmax层梯度: ∇ z = [ 0.0175 , − 0.0175 ] ∇_z = [0.0175, -0.0175] ∇z=[0.0175,−0.0175]

3. 全连接层反向传播

权重梯度计算

公式: ∂ L / ∂ W i j = ( ∂ L / ∂ z j ) × a i ∂L/∂W_ij = (∂L/∂z_j) × a_i ∂L/∂Wij=(∂L/∂zj)×ai (其中a_i是输入到全连接层的第i个神经元)

对于W[0,1] (连接展平层第1个神经元到输出第2个神经元):

∂ L / ∂ W [ 0 , 1 ] = ( ∂ L / ∂ z 2 ) × f l a t t e n [ 0 ] = ( − 0.0175 ) × 3.2 = − 0.056 ∂L/∂W[0,1] = (∂L/∂z2) × flatten[0] = (-0.0175) × 3.2 = -0.056 ∂L/∂W[0,1]=(∂L/∂z2)×flatten[0]=(−0.0175)×3.2=−0.056

偏置梯度计算

公式: ∂ L / ∂ b j = ∂ L / ∂ z j ∂L/∂b_j = ∂L/∂z_j ∂L/∂bj=∂L/∂zj

∂ L / ∂ b 1 = ∂ L / ∂ z 1 = 0.0175 ∂L/∂b1 = ∂L/∂z1 = 0.0175 ∂L/∂b1=∂L/∂z1=0.0175
∂ L / ∂ b 2 = ∂ L / ∂ z 2 = − 0.0175 ∂L/∂b2 = ∂L/∂z2 = -0.0175 ∂L/∂b2=∂L/∂z2=−0.0175

输入梯度(传递到前一层)

公式: ∂ L / ∂ a i = Σ j ( ∂ L / ∂ z j ) × W i j ∂L/∂a_i = Σ_j (∂L/∂z_j) × W_ij ∂L/∂ai=Σj(∂L/∂zj)×Wij

对于展平层第1个神经元:

∂ L / ∂ f l a t t e n [ 0 ] = ( ∂ L / ∂ z 1 ) × W [ 0 , 0 ] + ( ∂ L / ∂ z 2 ) × W [ 0 , 1 ] ∂L/∂flatten[0] = (∂L/∂z1)×W[0,0] + (∂L/∂z2)×W[0,1] ∂L/∂flatten[0]=(∂L/∂z1)×W[0,0]+(∂L/∂z2)×W[0,1]
= 0.0175 × 0.1 + ( − 0.0175 ) × 0.2 = 0.0175×0.1 + (-0.0175)×0.2 =0.0175×0.1+(−0.0175)×0.2
= 0.00175 − 0.0035 = 0.00175 - 0.0035 =0.00175−0.0035
= − 0.00175 = -0.00175 =−0.00175

4. 展平层反向传播

将12维梯度向量reshape为(3, 2, 2)

∇ P 1 = [ [ − 0.00175 , . . . ] , . . . ] ∇_P1 = [[-0.00175, ...], ...] ∇P1=[[−0.00175,...],...] # 2×2
∇ P 2 = [ [ . . . ] , . . . ] ∇_P2 = [[...], ...] ∇P2=[[...],...] # 2×2
∇ P 3 = [ [ . . . ] , . . . ] ∇_P3 = [[...], ...] ∇P3=[[...],...] # 2×2

5. 最大池化层反向传播

关键原则:梯度仅传递到前向传播中最大值所在位置

假设前向传播中,P1[0,0]=3.2来自A1的(0,0)位置,则:

∂ L / ∂ A 1 [ 0 , 0 ] = ∂ L / ∂ P 1 [ 0 , 0 ] = − 0.00175 ∂L/∂A1[0,0] = ∂L/∂P1[0,0] = -0.00175 ∂L/∂A1[0,0]=∂L/∂P1[0,0]=−0.00175
∂ L / ∂ A 1 [ 其他非最大值位置 ] = 0 ∂L/∂A1[其他非最大值位置] = 0 ∂L/∂A1[其他非最大值位置]=0

6. ReLU层反向传播

公式: ∂ L / ∂ C i = ∂ L / ∂ A i × I ( A i > 0 ) ∂L/∂C_i = ∂L/∂A_i × I(A_i > 0) ∂L/∂Ci=∂L/∂Ai×I(Ai>0) (其中I是指示函数)

假设A1[0,0] = ReLU(C1[0,0]) = 0,则:

∂ L / ∂ C 1 [ 0 , 0 ] = ∂ L / ∂ A 1 [ 0 , 0 ] × I ( 0 > 0 ) ∂L/∂C1[0,0] = ∂L/∂A1[0,0] × I(0 > 0) ∂L/∂C1[0,0]=∂L/∂A1[0,0]×I(0>0)
= − 0.00175 × 0 = -0.00175 × 0 =−0.00175×0
= 0 = 0 =0

假设A1[0,1] = ReLU(C1[0,1]) = 3.2 > 0,则:

∂ L / ∂ C 1 [ 0 , 1 ] = ∂ L / ∂ A 1 [ 0 , 1 ] × I ( 3.2 > 0 ) ∂L/∂C1[0,1] = ∂L/∂A1[0,1] × I(3.2 > 0) ∂L/∂C1[0,1]=∂L/∂A1[0,1]×I(3.2>0)
= [ 对应梯度 ] × 1 = [对应梯度] × 1 =[对应梯度]×1

7. 卷积层反向传播

卷积核梯度计算

公式: ∂ L / ∂ K = 卷积操作 ( 输入 X , 输出梯度 ∂ L / ∂ C ) ∂L/∂K = 卷积操作(输入X, 输出梯度∂L/∂C) ∂L/∂K=卷积操作(输入X,输出梯度∂L/∂C)

对于K1的权重K1[0,0]:

∂ L / ∂ K 1 [ 0 , 0 ] = Σ i Σ j X [ i : i + 3 , j : j + 3 ] [ 0 , 0 ] × ∂ L / ∂ C 1 [ i , j ] ∂L/∂K1[0,0] = Σ_i Σ_j X[i:i+3, j:j+3][0,0] × ∂L/∂C1[i,j] ∂L/∂K1[0,0]=ΣiΣjX[i:i+3,j:j+3][0,0]×∂L/∂C1[i,j]

输入梯度(如需要)

公式: ∂ L / ∂ X = 全卷积 ( 180 度旋转的 K , ∂ L / ∂ C ) ∂L/∂X = 全卷积(180度旋转的K, ∂L/∂C) ∂L/∂X=全卷积(180度旋转的K,∂L/∂C)(带填充)


第三部分:神经元视角计算逻辑

卷积层神经元

每个输出特征图的每个位置对应一个神经元:

  • 感受野:输入图像的3×3区域
  • 连接权重:卷积核的9个权重+1个偏置
  • 计算 : z = Σ ( w i × x i ) + b z = Σ(w_i × x_i) + b z=Σ(wi×xi)+b

池化层神经元

每个输出位置对应一个神经元:

  • 连接:来自前一层2×2区域的4个神经元
  • 计算 : 输出 = m a x ( 输入 1 , 输入 2 , 输入 3 , 输入 4 ) 输出 = max(输入1, 输入2, 输入3, 输入4) 输出=max(输入1,输入2,输入3,输入4)
  • 无参数学习

全连接层神经元

与传统神经元相同:

  • 连接:与前一层所有神经元连接
  • 计算 : z = Σ ( w i × a i ) + b z = Σ(w_i × a_i) + b z=Σ(wi×ai)+b

第四部分:关键公式总结表

层类型 前向传播公式 反向传播梯度公式
卷积层 C = X ⊛ K + b C = X ⊛ K + b C=X⊛K+b ∂ L / ∂ K = X ⊛ ∂ L / ∂ C ∂L/∂K = X ⊛ ∂L/∂C ∂L/∂K=X⊛∂L/∂C ∂ L / ∂ X = r o t 180 ( K ) ⊛ ∂ L / ∂ C ∂L/∂X = rot180(K) ⊛ ∂L/∂C ∂L/∂X=rot180(K)⊛∂L/∂C
ReLU A = m a x ( 0 , C ) A = max(0, C) A=max(0,C) ∂ L / ∂ C = ∂ L / ∂ A × I ( C > 0 ) ∂L/∂C = ∂L/∂A × I(C>0) ∂L/∂C=∂L/∂A×I(C>0)
最大池化 P = m a x ( 区域 ) P = max(区域) P=max(区域) ∂ L / ∂ A i = ∂ L / ∂ P j ( 如果 A i 是最大值 ) ∂L/∂A_i = ∂L/∂P_j (如果A_i是最大值) ∂L/∂Ai=∂L/∂Pj(如果Ai是最大值)
全连接 Z = W ⋅ A + b Z = W·A + b Z=W⋅A+b ∂ L / ∂ W = A ⋅ ( ∂ L / ∂ Z ) T ∂L/∂W = A·(∂L/∂Z)^T ∂L/∂W=A⋅(∂L/∂Z)T ∂ L / ∂ b = ∂ L / ∂ Z ∂L/∂b = ∂L/∂Z ∂L/∂b=∂L/∂Z ∂ L / ∂ A = W T ⋅ ∂ L / ∂ Z ∂L/∂A = W^T·∂L/∂Z ∂L/∂A=WT⋅∂L/∂Z
Softmax P i = e z i / Σ e z j P_i = e^{z_i}/Σe^{z_j} Pi=ezi/Σezj ∂ L / ∂ z i = P i − y i ∂L/∂z_i = P_i - y_i ∂L/∂zi=Pi−yi

第五部分:参数更新示例

使用梯度下降法更新参数(学习率α=0.01):

更新全连接层权重W[0,1]:

W n e w [ 0 , 1 ] = W o l d [ 0 , 1 ] − α × ∂ L / ∂ W [ 0 , 1 ] W_new[0,1] = W_old[0,1] - α × ∂L/∂W[0,1] Wnew[0,1]=Wold[0,1]−α×∂L/∂W[0,1]
= 0.2 − 0.01 × ( − 0.056 ) = 0.2 - 0.01 × (-0.056) =0.2−0.01×(−0.056)
= 0.2 + 0.00056 = 0.2 + 0.00056 =0.2+0.00056
= 0.20056 = 0.20056 =0.20056

更新卷积核K1[0,0]:

假设计算得 ∂ L / ∂ K 1 [ 0 , 0 ] = 0.003 ∂L/∂K1[0,0] = 0.003 ∂L/∂K1[0,0]=0.003

K 1 n e w [ 0 , 0 ] = K 1 o l d [ 0 , 0 ] − α × ∂ L / ∂ K 1 [ 0 , 0 ] K1_new[0,0] = K1_old[0,0] - α × ∂L/∂K1[0,0] K1new[0,0]=K1old[0,0]−α×∂L/∂K1[0,0]
= 1 − 0.01 × 0.003 = 1 - 0.01 × 0.003 =1−0.01×0.003
= 1 − 0.00003 = 1 - 0.00003 =1−0.00003
= 0.99997 = 0.99997 =0.99997


第六部分:计算复杂度分析

操作 计算量 (本例) 大O表示法
卷积层前向 3×(5×5)×(3×3) = 675次乘加 O ( K 2 × M 2 × C i n × C o u t ) O(K²×M²×C_in×C_out) O(K2×M2×Cin×Cout)
池化层前向 3×(2×2)×4次比较 = 48次比较 O ( C × H o u t × W o u t × k 2 ) O(C×H_out×W_out×k²) O(C×Hout×Wout×k2)
全连接前向 12×2 = 24次乘加 O ( N i n × N o u t ) O(N_in×N_out) O(Nin×Nout)
Softmax前向 2次exp + 1次求和 + 2次除法 O ( N c l a s s e s ) O(N_classes) O(Nclasses)
反向传播 约2-3倍前向计算量 O ( 前向计算量 ) O(前向计算量) O(前向计算量)

注:K=卷积核尺寸,M=输出尺寸,C=通道数,N=神经元数


第七部分:可视化理解

复制代码
前向传播数据流:
输入X(7×7) 
→ [卷积K1] → C1(5×5) → [ReLU] → A1(5×5) → [最大池化] → P1(2×2)
→ [卷积K2] → C2(5×5) → [ReLU] → A2(5×5) → [最大池化] → P2(2×2) 
→ [卷积K3] → C3(5×5) → [ReLU] → A3(5×5) → [最大池化] → P3(2×2)
→ [展平] → 向量(12) → [全连接] → Z(2) → [Softmax] → 概率(2)

反向传播梯度流:
损失L ← 概率(2) ← [Softmax梯度] ← Z(2) ← [全连接梯度] ← 向量(12) 
← [reshape] ← (P1,P2,P3梯度) ← [池化梯度] ← (A1,A2,A3梯度) 
← [ReLU梯度] ← (C1,C2,C3梯度) ← [卷积梯度] ← 输入X梯度

关键点总结

  1. 卷积层:通过局部连接和权值共享提取空间特征
  2. 池化层:降低空间分辨率,增强平移不变性
  3. 全连接层:整合所有特征进行最终分类
  4. 前向传播:数据从输入流向输出,计算预测值
  5. 反向传播:梯度从损失函数反向流动,计算参数更新量
  6. 计算核心:链式法则 + 各层特定的梯度公式
相关推荐
AI周红伟2 小时前
周红伟: DeepSeek大模型微调和部署实战:大模型全解析、部署及大模型训练微调代码实战
人工智能·深度学习
徐小夕@趣谈前端2 小时前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
HAREWORK_FFF2 小时前
近几年,非技术岗转向AI岗位的现实可能性
人工智能
weixin_6682 小时前
深度分析:多模态、全模态、VLM、ASR、TTS、STT、OCR- AI分析分享
人工智能
问好眼2 小时前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛
LeonDL1682 小时前
基于YOLO11深度学习的衣物识别系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】
人工智能·python·pyqt5·yolo数据集·yolo11数据集·yolo11深度学习·衣物识别系统
犀思云2 小时前
企业总部网络全球化扩张:利用FusionWAN NaaS 破解“网络成本瓶颈”
网络·人工智能·机器人·智能仓储·专线
Data_Journal2 小时前
如何使用 Python 解析 JSON 数据
大数据·开发语言·前端·数据库·人工智能·php
陈天伟教授2 小时前
人工智能应用- 语言理解:09.大语言模型
人工智能·语言模型·自然语言处理