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

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

BP神经网络是一种多层前馈神经网络,通过反向传播算法进行训练,它由输入层、隐层和输出层组成,每层的神经元通过权重连接,在训练过程中,网络通过调整权重来最小化误差,下面将详细讲解BP神经网络代码的实现,并提供一个具体的例子来说明其工作原理。

一、BP神经网络原理回顾

bp神经网络代码讲解

1、BP神经网络的结构:BP神经网络由输入层、隐层和输出层组成,隐层可以有多层,整个网络以前馈式进行计算,即每层的输出作为下层的输入,直到输出层,每层的计算公式如下:

\( y = T(WX + B) \)

\( X \) 是该层的输入,\( W \) 是该层的权重,\( B \) 是该层的阈值,\( T \) 是该层的激活函数。

2、BP神经网络的训练算法流程:梯度下降算法求解BP神经网络的流程如下:

先初始化一个解。

迭代计算所有 \( w \) 和 \( b \) 在当前处的梯度 \( dw \) 和 \( db \)。

将 \( w \) 和 \( b \) 往负梯度方向更新:\( w = w lr \cdot dw \),\( b = b lr \cdot db \)。

bp神经网络代码讲解

判断是否满足退出条件,如果满足则退出迭代。

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

1、数据介绍:为了方便理解,我们使用以下简单数据:sin函数在 [-5,5] 之间的20个采样数据。

2、pytorch实现BP神经网络代码:下面是在pytorch中实现BP神经网络的代码,特别说明:需要先安装pytorch包。

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_()
    b2.grad.zero_()

三、matlab实现BP神经网络代码

在matlab中实现BP神经网络的代码如下,这里采用一个简单的例子,构建一个2输入1输出,3个隐含层的BP网络,称为2-3-1网络结构。

% MATLAB实现BP神经网络代码示例
clear; close all; clc;
% 读取数据
input = randi([1 20], 200, 2); %载入输入数据
output = input(:, 1) + input(:, 2); %载入输出数据
% 设置训练数据和预测数据
input_train = input(1:190,:)'; output_train = output(1:190)';
input_test = input(191:200,:)'; output_test = output(191:200)';
% 归一化处理
[inputn, inputps] = mapminmax(input_train); %归一化到[-1,1]之间
[outputn, outputps] = mapminmax(output_train);
% 构建BP神经网络
net = newff(inputn, outputn, 3, {'tansig', 'purelin'}, 'trainlm'); %建立模型,传递函数使用purelin,采用梯度下降法训练
% 网络参数配置
net.trainParam.epochs = 1000; %训练次数设置为1000次
net.trainParam.lr = 0.01; %学习速率设置为0.01
net.trainParam.goal = 0.00001; %训练目标最小误差设置为0.00001
% 训练BP神经网络
net = train(net, inputn, outputn); %开始训练
% 测试样本归一化
inputn_test = mapminmax('apply', input_test, inputps); %对样本数据进行归一化
% BP神经网络预测
an = sim(net, inputn_test); %用训练好的模型进行仿真
% 预测结果反归一化与误差计算     
test_simu = mapminmax('reverse', an, outputps); %把仿真得到的数据还原为原始的数量级
error = test_simu output_test; %预测值和真实值的误差
% 绘制预测值和真实值对比图
figure('units', 'normalized', 'position', [0.119 0.2 0.38 0.5]);
plot(output_test, 'bo-'); hold on; plot(test_simu, 'r*-'); hold on;
plot(error, 'square', 'MarkerFaceColor', 'b'); legend('期望值', '预测值', '误差');
xlabel('数据组数'); ylabel('样本值'); title('BP神经网络测试集的预测值与实际值对比图');

相关问题与解答

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

A1: 学习率的选择通常需要通过实验来确定,较大的学习率可能会导致训练不稳定,而较小的学习率则会导致训练速度过慢,可以通过网格搜索或自适应学习率优化算法(如Adam)来选择最佳的学习率。

Q2: 为什么BP神经网络容易陷入局部最优?

bp神经网络代码讲解

A2: BP神经网络使用梯度下降算法进行训练,而梯度下降算法在非凸优化问题中容易陷入局部最优,为了避免这种情况,可以使用一些改进的优化算法,如动量法、RMSprop或Adam等,这些算法在一定程度上可以帮助跳出局部最优,提高训练效果。

BP神经网络是一种强大的工具,适用于各种复杂的模式识别和回归任务,通过合理设计网络结构和参数,并使用适当的优化算法,可以有效提高网络的性能,希望本文能够帮助读者更好地理解和实现BP神经网络。

以上就是关于“bp神经网络代码讲解”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

-- 展开阅读全文 --
头像
App云主机,如何为企业应用提供高效、灵活的托管解决方案?
« 上一篇 2024-12-04
如何进行服务器系统的重装操作?
下一篇 » 2024-12-04
取消
微信二维码
支付宝二维码

发表评论

暂无评论,1人围观

头像 殷娜 说道:
2024-08-22 · UC Browser 13.7.2.1636 Apple iPhone

在DOU+投放中,精准定位和内容质量是关键,合理分配预算,结合数据分析调整策略,才能实现流量和效益的最大化。

头像 郝杰 说道:
2024-09-05 · Google Chrome 78.0.3904.108 Huawei MLD

【干货分享】🔥想要DOU+投放效果翻倍?跟着这五大策略走,精准投放,流量飙升,轻松上热门!💡快来get!🎯

目录[+]