乐于分享
好东西不私藏

AI一眼看穿图片的全过程:前向传播小剧场

AI一眼看穿图片的全过程:前向传播小剧场

引言

前几篇文章,我们认识了感知机、Sigmoid和ReLU。它们像一个个独立的“神经元”,会接收信号、做加权求和、然后决定要不要“激活”。但单个神经元只能解决最简单的问题——比如判断“是不是两个输入都是1”。想要识别图片里有没有猫,我们需要把成千上万个神经元串联起来,组成一个多层网络。

那么问题来了:当一张图片进入这个庞大的神经元网络时,数据到底是怎么“流动”的?AI又是如何从像素点一步步“看”出“这是一只猫”的?

今天,我们就把这个过程画成一张“地铁线路图”,再用Python模拟一次完整的前向传播。读完这篇文章,你会明白:AI的“一眼看穿”,其实是一层一层的“流水线作业”。

前向传播,就像工厂的流水线。

想象一个汽车制造工厂:

第一道工序:把钢板冲压成车门。

第二道工序:把车门焊接到车架上。

第三道工序:给车身喷漆。

最后一道工序:装上轮胎,整车下线。

每一道工序都只负责自己的任务,然后把半成品交给下一道工序。神经网络的前向传播,就是这样一个层层传递、逐步加工的过程。

把“输入图片”想象成原材料钢板,把“最终分类结果”想象成成品汽车。中间的每一层神经元,就是一道道工序:

输入层:接收原始像素值(比如28×28=784个数字)。

隐藏层:对输入做加权求和、激活,提取特征。

输出层:给出最终判断(比如猫的概率0.82,狗的概率0.15)。

数据从输入层进入,经过隐藏层的一步步加工,最终从输出层流出——这个单向流动的过程,就叫前向传播(Forward Propagation)。

一个三层神经网络的“解剖图”

为了更直观,我们画一个最简单的三层网络:

箭头代表权重(每条连接线都有一个数字,代表“影响力”)。

每个神经元内部做两件事:加权求和(把所有输入乘以权重相加,再加偏置),然后过激活函数(比如ReLU或Sigmoid)。

这个网络的结构用数学语言写出来就是:

其中 W1 和 W2 是权重矩阵,b1 和 b2 是偏置向量。

动手环节:用Python模拟一次前向传播

光说不练假把式。下面我们用NumPy写一个三层网络,随机初始化权重,然后输入一张“假图片”(一个3维向量),看看数据是如何一层层流动的。

import numpy as np# 设置随机种子,让每次运行结果一致np.random.seed(42)# ---------- 网络结构定义 ----------# 输入层:3个神经元# 隐藏层:4个神经元# 输出层:2个神经元# 随机初始化权重和偏置(模拟训练好的网络)W1 = np.random.randn(34)   # 3x4 矩阵,连接输入层到隐藏层b1 = np.random.randn(4)      # 隐藏层偏置(4个)W2 = np.random.randn(42)   # 4x2 矩阵,连接隐藏层到输出层b2 = np.random.randn(2)      # 输出层偏置(2个)# 定义激活函数(这里隐藏层用ReLU,输出层用Sigmoid)def relu(x):    return np.maximum(0, x)def sigmoid(x):    return 1 / (1 + np.exp(-x))# ---------- 前向传播 ----------def forward(x):    # 第一段:输入 → 隐藏层    z1 = np.dot(x, W1) + b1      # 加权求和    a1 = relu(z1)                # ReLU激活    print("隐藏层加权和 z1:", z1)    print("隐藏层激活值 a1:", a1)    # 第二段:隐藏层 → 输出层    z2 = np.dot(a1, W2) + b2     # 加权求和    a2 = sigmoid(z2)             # Sigmoid激活,得到最终概率    print("输出层加权和 z2:", z2)    print("输出层概率 a2:", a2)    return a2# 模拟一张“图片”(3个特征值)x_input = np.array([0.50.20.9])  # 比如三个像素点的亮度值print("输入向量 x:", x_input)print("="*40)output = forward(x_input)print("="*40)print("最终输出概率:", output)

运行结果示例(你的数值会略有不同)

解读一下数据的“旅程”:

输入的3个像素值 [0.5, 0.2, 0.9] 乘以权重矩阵 W₁,加上偏置 b₁,得到隐藏层的“原始信号” z1:

z1 经过ReLU,负数被清零,得到激活值 a1。注意后三个神经元因为输入为负而被彻底“关闭”了,只有第一个神经元保留了一个微弱的正信号 0.02。这就是 ReLU 的稀疏激活性——每次只点亮极少数神经元。

接着,a1 再乘以权重矩阵 W₂,加上偏置 b₂,得到输出层的原始信号 z2。    

z2 经过Sigmoid,被压缩成0到1之间的概率。

最终网络认为:第一类的概率是 36%,第二类的概率是 53%。如果这是一个二分类任务(比如猫/狗),网络会倾向于预测这张“图片”属于第二类——虽然信心不算特别强,但已经有了明确的偏向。

整个过程,从输入到输出,数据只向前流动,不回头——这就是“前向传播”的全部秘密。

前向传播在YOLO里是怎么跑的?

在我们熟悉的YOLO模型,前向传播的过程要复杂得多(几百层卷积),但核心逻辑完全一样。一张416×416×3的图片进入网络后:

Backbone:经过几十层卷积+BN+激活(通常是SiLU或ReLU),逐步提取边缘、纹理、语义特征。

Neck:对不同尺度的特征图进行融合。

Head:最后输出三个尺度的检测结果,每个网格预测边界框坐标、置信度和类别概率。

虽然YOLO有上千万个参数,但每一次推理(inference)都是一次标准的前向传播:数据单向流动,没有反向传播的梯度计算,所以速度极快。你在YOLO里运行 model.predict(),本质上就是让数据跑了一遍上面那个 forward() 函数的“超级加长版”。

一张图总结:前向传播的“流水线”

如果要用一句话记住前向传播,那就是:

输入 → 加权求和 → 激活 → 加权求和 → 激活 → ... → 输出

每一层都在做同样的事:接收上一层的输出,乘以自己的权重,加上偏置,过激活函数,然后传给下一层。

步骤做什么类比
① 加权求和z = W·x + b把各种意见按重要性综合起来
② 激活函数a = f(z)决定要不要把这个意见“传下去”
③ 传递a 成为下一层的 x把半成品交给下一道工序

明天,我们会反过来走一遍:如果AI预测错了怎么办?它怎么知道自己错在哪,又怎么去修正权重?这就是反向传播的故事——也是神经网络“学习”的核心。