BP神经网络学习内容分享:前向传播与后向传播

2024-09-01 22:28

本文主要是介绍BP神经网络学习内容分享:前向传播与后向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在深度学习和神经网络领域,BP(Backpropagation,反向传播)神经网络是一种非常基础且广泛应用的网络结构。它通过前向传播进行预测,并通过反向传播算法调整网络权重以优化预测结果。本文将详细介绍BP神经网络的前向传播和反向传播过程,并展示一个简单的BP神经网络实现。

一、前向传播过程

        1.基本概念

        前向传播是神经网络中信息从输入层经过隐藏层到输出层的传递过程。在这个过程中,每一层的神经元接收前一层神经元的输出作为输入,并通过激活函数处理后输出给下一层。

        2.公式表示

        假设我们有一个简单的三层神经网络(输入层、一个隐藏层、输出层),每层神经元均使用Sigmoid激活函数。如图所示就是前向传播图:          (1)输入层到隐藏层

       其中,xi 是输入层第 i 个神经元的输出,wij 是从输入层第 i 个神经元到隐藏层第 j 个神经元的权重,bj 是隐藏层第 j 个神经元的偏置,zj 是隐藏层第 j 个神经元的线性组合输出,aj 是经过Sigmoid激活函数后的输出。

         (2)隐藏层到输出层

       过程与输入层到隐藏层类似,只是输入变为了隐藏层的输出aj。

           3.前向传播包括以下几个步骤:

         (1)将输入数据送入输入层,每个输入节点接收一个输入数据值。

         (2)将输入数据与输入层与隐藏层之间的连接权重相乘,并将结果加权求和,得到隐藏层神经元的输入值。

         (3)对隐藏层的输入值进行激活函数的处理,将其转化为隐藏层神经元的输出值。

         (4)重复步骤2和3,将隐藏层的输出值与隐藏层与输出层之间的连接权重相乘,并加权求和,得到输出层神经元的输入值。

        (5)对输出层的输入值进行激活函数的处理,将其转化为输出层神经元的输出值。

        (6)输出层的输出值即为BP网络对输入数据的预测结果。

二、反向传播算法

      1.链式法则

      反向传播算法的核心是链式法则,用于计算损失函数关于每个权重的梯度。如图所示反向传播计算:

       2.梯度下降

       梯度下降是一种优化算法,用于最小化损失函数。在BP神经网络中,我们通过反向传播算法计算梯度,然后使用梯度下降法更新权重。

       3.反向传播计算

       (1)计算输出层的误差

       其中,yk 是真实输出,ok 是网络预测输出。

       (2)计算隐藏层的误差

       (3)计算输出层的误差

        其中,η 是学习率。

        4.后向传播包括以下几个步骤:

       (1)计算网络输出层的误差,即预测值与真实值之间的差异。

       (2)根据误差计算输出层神经元的梯度,用于调整输出层与隐藏层之间的连接权重。

       (3)根据输出层梯度和隐藏层的输出值,计算隐藏层神经元的梯度,用于调整隐藏层与输入层之间的连接权重。

       (4)根据梯度和学习率,调整连接权重,使得误差最小化。

       (5)重复以上步骤,直到网络的预测结果达到预期或训练迭代次数达到设定值。

三、BP神经网络代码实现

        下面是一个简单的BP神经网络实现,使用Python编写,并手动计算权重更新。

import numpy as np  def sigmoid(x):  return 1 / (1 + np.exp(-x))  def sigmoid_derivative(x):  return x * (1 - x)  # 初始化参数  
input_size = 3  
hidden_size = 4  
output_size = 2  np.random.seed(1)  
weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))  
weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))  
bias_hidden = np.zeros(hidden_size)  
bias_output = np.zeros(output_size)  # 前向传播  
def forward_pass(X):  hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden  hidden_layer_output = sigmoid(hidden_layer_input)  final_output_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output  final_output = sigmoid(final_output_input)  return final_output, hidden_layer_output  # 反向传播和权重更新  
def backward_pass(X, y, output, hidden_output):  # 计算输出层误差  output_error = y - output  d_output = output_error * sigmoid_derivative(output)  # 计算隐藏层误差  hidden_error = d_output.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_output)  # 更新输出层权重和偏置  weights_hidden_output += hidden_output.T.dot(d_output) * 0.1  bias_output += np.sum(d_output, axis=0, keepdims=True) * 0.1  # 更新输入层到隐藏层权重和偏置  weights_input_hidden += X.T.dot(hidden_error) * 0.1  bias_hidden += np.sum(hidden_error, axis=0, keepdims=True) * 0.1  # 示例数据  
X = np.array([[0.1, 0.2, 0.3]])  
y = np.array([[0.9, 0.1]])  # 训练网络  
for _ in range(10000):  output, hidden_output = forward_pass(X)  backward_pass(X, y, output, hidden_output)  # 测试网络  
print("Output after training:", forward_pass(X)[0])

四、总结

        本文详细介绍了BP神经网络的前向传播和反向传播算法,并通过Python代码实现了一个简单的BP神经网络。通过不断迭代训练,网络能够逐渐优化其权重,从而提高预测的准确性。

这篇关于BP神经网络学习内容分享:前向传播与后向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128218

相关文章

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck