Python神经网络代码总结 (Python Neural Network Code Summary)
这份代码是一个从零开始实现的、基础的前馈神经网络(Feedforward Neural Network)。它不依赖任何外部机器学习库,清晰地展示了神经网络的核心工作原理。
1. 核心概述 (Core Overview) 🧠
该代码通过三个核心类构建了一个简单的神经网络:
Neuron
: 网络的基本计算单元。NeuronLayer
: 由多个神经元组成的层。NeuronNet
: 整合输入层、隐藏层和输出层,并负责网络的训练和预测。
其关键功能包括:
- 前向传播 (Feed Forward): 将输入数据从输入层传到输出层,得到预测结果。
- 反向传播 (Backpropagation): 计算预测误差,并将误差从输出层反向传播,用于更新神经元的权重(weights)和偏置(bias)。
2. 类结构与功能 (Class Structure & Functionality)
Neuron
类
这是最基础的构建模块。
- 功能 (Functionality): 模拟单个神经元,负责接收输入、计算加权和、通过激活函数输出结果,并计算用于反向传播的梯度。
- 关键属性 (Key Attributes):
weights
: 权重列表,决定了每个输入信号的重要性。bias
: 偏置项,用于调整神经元的激活阈值。
- 关键方法 (Key Methods):
calculate_output(inputs)
: 接收输入,计算加权和 (calculate_total_net_input
),并通过 Sigmoid 激活函数 (squash
) 得到输出。squash(total_net_input)
: 激活函数,公式为 f(x)=frac11+e−x。它将任意输入值压缩到 (0, 1) 区间。pd_...
方法: “pd” 代表 “Partial Derivative” (偏导数)。这些方法是反向传播算法的核心,用于计算误差对网络中各个参数(权重、偏置)的梯度。例如pd_error_wrt_total_net_output
计算的是误差对神经元输出值的偏导数。
NeuronLayer
类
神经元的集合。
- 功能 (Functionality): 管理一层中的所有神经元,并将输入数据传递给该层的所有神经元进行处理。
- 关键属性 (Key Attributes):
neurons
: 一个包含多个Neuron
对象的列表。
- 关键方法 (Key Methods):
feed_forward(inputs)
: 遍历层内所有神经元,收集它们的输出,并将输出列表作为该层的最终输出。
NeuronNet
类
完整的神经网络。
- 功能 (Functionality): 构建并管理整个网络(包含一个隐藏层和一个输出层)。它负责初始化权重、执行完整的前向传播,并通过训练数据来更新整个网络的参数。
- 关键属性 (Key Attributes):
hidden_layer
: 隐藏层 (NeuronLayer
对象)。output_layer
: 输出层 (NeuronLayer
对象)。learning_rate
: 学习率,控制每次训练时权重和偏置的更新幅度。
- 关键方法 (Key Methods):
feed_forward(inputs)
: 驱动数据流过整个网络,从隐藏层到输出层。train(training_inputs, training_outputs)
: 最核心的方法。它实现了完整的反向传播和梯度下降算法来学习。
3. 关键算法:train
方法解析 (Key Algorithm: train
Method Explained)
train
方法是网络学习的关键,它严格遵循反向传播的步骤:
- 前向传播 (Forward Pass): 首先调用
feed_forward
计算当前网络对输入数据的预测输出。 - 计算输出层误差 (Calculate Output Layer Error):
- 计算每个输出层神经元的误差对“加权输入总和”的偏导数 (
pd_error_wrt_output_neurons_total_net_input
)。这是链式法则的第一步。
- 计算每个输出层神经元的误差对“加权输入总和”的偏导数 (
- 计算隐藏层误差 (Calculate Hidden Layer Error):
- 将输出层的误差反向传播回隐藏层。
- 对于每个隐藏层神经元,其误差是所有与之相连的输出层神经元误差的加权和。
- 更新权重和偏置 (Update Weights and Biases):
- 输出层更新: 利用步骤2计算的梯度,结合学习率,更新输出层中每个神经元的权重和偏置。
- 隐藏层更新: 利用步骤3计算的梯度,结合学习率,更新隐藏层中每个神经元的权重和偏置。
- 更新公式为:
新权重 = 旧权重 - 学习率 * 误差梯度
。
Python
1 | # 伪代码:train方法的核心逻辑 |
1.先定义网络:写网络Net的Class,声明网络的实例net=Net(),
2.定义优化器optimizer=optim.xxx(net.parameters(),lr=xxx),
3.再定义损失函数(自己写class或者直接用官方的,compute_loss=nn.MSELoss()或者其他。
4.在定义完之后,开始一次一次的循环:
①先清空优化器里的梯度信息,optimizer.zero_grad();
②再将input传入,output=net(input) ,正向传播
③算损失,loss=compute_loss(target,output) ##这里target就是参考标准值GT,需要自己准备,和之前传入的input一一对应
④误差反向传播,loss.backward()
⑤更新参数,optimizer.step()[参考](https://wanghao15536870732.github.io/2019/08/07/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/)