BP神经网络代码讲解,如何理解和实现?

小贝
预计阅读时长 12 分钟
位置: 首页 小红书 正文

BP神经网络,全称反向传播神经网络(Backpropagation Neural Network),是一种多层前馈神经网络,通过误差的反向传播来调整网络参数,以达到优化模型的目的,BP神经网络由输入层、隐层和输出层组成,每一层都有若干神经元节点,相邻两层之间的神经元通过权重连接。

一、BP神经网络原理回顾

bp神经网络代码的讲解

1. BP神经网络的结构简单回顾

BP神经网络的结构包括输入层、一个或多个隐层以及输出层,数据从输入层进入,经过每一层的处理后传递到下一层,直到输出层,每一层中的神经元通过激活函数对输入进行处理,并将结果传递给下一层,常见的激活函数有S形函数(如tanh或sigmoid)和线性函数(如ReLU)。

2. BP神经网络的训练算法流程

BP神经网络的训练主要包括以下几个步骤:

1、前向传播:输入数据通过网络层层传递,计算每一层的输出,直到输出层。

2、计算损失:使用损失函数(如均方误差)计算网络输出与实际标签之间的差异。

3、反向传播:根据损失函数的梯度,通过链式法则计算每层权重和偏置的梯度。

bp神经网络代码的讲解

4、更新权重和偏置:使用优化算法(如梯度下降法)更新网络的权重和偏置,以最小化损失函数。

5、迭代训练:重复上述步骤,直到满足停止条件(如达到最大迭代次数或损失函数收敛)。

二、python实现BP神经网络代码

1. 数据介绍

为了方便理解,我们采用一个简单的数据集:在[-5, 5]范围内生成20个均匀分布的数据点,并计算它们的正弦值作为目标输出。

2. pytorch实现BP神经网络代码

下面是一个使用PyTorch实现BP神经网络的示例代码:

import torch
import matplotlib.pyplot as plt
设置随机种子以保证结果可重复
torch.manual_seed(99)
定义前向传播函数
def forward(w1, b1, w2, b2, x):
    return w2 @ torch.tanh(w1 @ x + b1) + b2
定义损失函数(均方误差)
def loss(y, py):
    return ((y py) ** 2).mean()
生成训练数据
x = torch.linspace(-5, 5, 20).reshape(1, 20)  # 在[-5, 5]之间生成20个数作为x
y = torch.sin(x)  # 模型的输出值y
初始化网络参数
in_num = x.shape[0]  # 输入个数
out_num = y.shape[0]  # 输出个数
hn = 4  # 隐节点个数
w1 = torch.randn([hn, in_num], requires_grad=True)  # 初始化输入层到隐层的权重w1
b1 = torch.randn([hn, 1], requires_grad=True)  # 初始化隐层的阈值b1
w2 = torch.randn([out_num, hn], requires_grad=True)  # 初始化隐层到输出层的权重w2
b2 = torch.randn([out_num, 1], requires_grad=True)  # 初始化输出层的阈值b2
lr = 0.01  # 学习率
for i in range(5000):  # 训练5000步
    py = forward(w1, b1, w2, b2, x)  # 计算网络的输出
    L = loss(y, py)  # 计算损失函数
    print('第', str(i), '轮:', L)  # 打印当前损失函数值
    L.backward()  # 用损失函数更新模型参数的梯度
    w1.data = w1.data w1.grad * lr  # 更新模型系数w1
    b1.data = b1.data b1.grad * lr  # 更新模型系数b1
    w2.data = w2.data w2.grad * lr  # 更新模型系数w2
    b2.data = b2.data b2.grad * lr  # 更新模型系数b2
    w1.grad.zero_()  # 清空w1梯度以便下次backward
    b1.grad.zero_()  # 清空b1梯度以便下次backward
    w2.grad.zero_()  # 清空w2梯度以便下次backward
    b2.grad.zero_()  # 清空b2梯度以便下次backward

3. 代码解释

部分描述代码说明
网络结构定义了BP神经网络的前向传播过程def forward(w1, b1, w2, b2, x): return w2 @ torch.tanh(w1 @ x + b1) + b2该函数接受输入数据x,通过权重w1和偏置b1计算隐层输出,再通过权重w2和偏置b2计算最终输出。
损失函数定义了均方误差作为损失函数def loss(y, py): return ((y py) ** 2).mean()计算预测值py与真实值y之间的均方误差。
数据准备生成训练数据x = torch.linspace(-5, 5, 20).reshape(1, 20) y = torch.sin(x)在[-5, 5]之间生成20个均匀分布的数据点,并计算它们的正弦值作为目标输出。
初始化参数初始化网络参数w1 = torch.randn([hn, in_num], requires_grad=True) b1 = torch.randn([hn, 1], requires_grad=True) w2 = torch.randn([out_num, hn], requires_grad=True) b2 = torch.randn([out_num, 1], requires_grad=True)随机初始化输入层到隐层的权重w1和偏置b1,隐层到输出层的权重w2和偏置b2
训练过程训练模型for i in range(5000): py = forward(w1, b1, w2, b2, x) L = loss(y, py) print('第', str(i), '轮:', L) L.backward() w1.data = w1.data w1.grad * lr b1.data = b1.data b1.grad * lr w2.data = w2.data w2.grad * lr b2.data = b2.data b2.grad * lr w1.grad.zero_() b1.grad.zero_() w2.grad.zero_() b2.grad.zero_()进行5000次迭代训练,每次迭代中计算网络输出和损失,更新梯度并调整权重和偏置。

相关问题与解答

bp神经网络代码的讲解

Q1: 为什么选择tanh作为激活函数?

A1: tanh函数是一种常用的S形激活函数,具有非线性特性,可以将输入映射到-1到1之间,相比于其他激活函数(如sigmoid),tanh在零点附近的梯度更大,有助于加快模型的收敛速度,tanh在负数范围内的输出不会趋近于零,这有助于保持梯度的流动,防止梯度消失问题。

Q2: 如何选择合适的学习率?

A2: 学习率的选择对模型的训练效果有很大影响,如果学习率过大,可能导致模型不稳定,甚至发散;如果学习率过小,则收敛速度会很慢,通常可以通过实验来确定最佳的学习率,一种常见的方法是从一个较小的学习率开始,逐渐增加,观察模型的训练情况,还可以使用学习率调度器动态调整学习率,例如在训练过程中逐步减小学习率,以提高收敛速度和稳定性。

以上内容就是解答有关“bp神经网络代码的讲解”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

-- 展开阅读全文 --
头像
为什么有些App不请求使用网络权限?
« 上一篇 2024-12-04
如何利用Bootstrap打造个性化的个人网站主题?
下一篇 » 2024-12-04
取消
微信二维码
支付宝二维码

发表评论

暂无评论,1人围观

目录[+]