0%

neuronNet

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 方法是网络学习的关键,它严格遵循反向传播的步骤:

  1. 前向传播 (Forward Pass): 首先调用 feed_forward 计算当前网络对输入数据的预测输出。
  2. 计算输出层误差 (Calculate Output Layer Error):
    • 计算每个输出层神经元的误差对“加权输入总和”的偏导数 (pd_error_wrt_output_neurons_total_net_input)。这是链式法则的第一步。
  3. 计算隐藏层误差 (Calculate Hidden Layer Error):
    • 将输出层的误差反向传播回隐藏层。
    • 对于每个隐藏层神经元,其误差是所有与之相连的输出层神经元误差的加权和
  4. 更新权重和偏置 (Update Weights and Biases):
    • 输出层更新: 利用步骤2计算的梯度,结合学习率,更新输出层中每个神经元的权重和偏置。
    • 隐藏层更新: 利用步骤3计算的梯度,结合学习率,更新隐藏层中每个神经元的权重和偏置。
    • 更新公式为:新权重 = 旧权重 - 学习率 * 误差梯度

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 伪代码:train方法的核心逻辑
# Pseudocode: Core logic of the train method

# 1. 计算输出层误差梯度
output_layer_gradients = []
for each neuron in output_layer:
gradient = calculate_error_gradient(target_output, neuron_output)
output_layer_gradients.append(gradient)

# 2. 计算隐藏层误差梯度(反向传播)
hidden_layer_gradients = []
for each neuron in hidden_layer:
error = sum(output_layer_gradients * weights_connecting_to_it)
gradient = error * neuron_output * (1 - neuron_output) # Sigmoid导数
hidden_layer_gradients.append(gradient)

# 3. 更新所有权重和偏置
for each neuron in output_layer:
neuron.weights -= learning_rate * output_layer_gradient * hidden_layer_output
neuron.bias -= learning_rate * output_layer_gradient

for each neuron in hidden_layer:
neuron.weights -= learning_rate * hidden_layer_gradient * network_input
neuron.bias -= learning_rate * hidden_layer_gradient

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/)