神经网络反向传播算法

今天我们来看一下神经网络中的反向传播算法,之前介绍了梯度下降与正向传播~       神经网络的反向传播

专栏:💎实战PyTorch💎

反向传播算法(Back Propagation,简称BP)是一种用于训练神经网络的算法。 

反向传播算法是神经网络中非常重要的一个概念,它由Rumelhart、Hinton和Williams于1986年提出。这种算法基于梯度下降法来优化误差函数,利用了神经网络的层次结构来有效地计算梯度,从而更新网络中的权重和偏置。

基本工作流程:

  1. 通过正向传播得到误差,所谓正向传播指的是数据从输入到输出层,经过层层计算得到预测值,并利用损失函数得到预测值和真实值之前的误差。
  2. 通过反向传播把误差传递给模型的参数,从而对网络参数进行适当的调整,缩小预测值和真实值之间的误差。
  3. 反向传播算法是利用链式法则进行梯度求解,然后进行参数更新。对于复杂的复合函数,我们将其拆分为一系列的加减乘除或指数,对数,三角函数等初等函数,通过链式法则完成复合函数的求导。

我们通过一个例子来简单理解下 BP 算法进行网络参数更新的过程🧧:

如图我们在最下边输入两个维度的值进入神经网络:0.05、0.1 ,经过两个隐藏层(每层两个神经元),每个神经元有两个值,左边为输入值,右边是经过激活函数后的输出值;经过这个神经网络后的输出值为:m1、m2,实际值为0.01、0.99 🌠

设置的初始权重w1,w2,...w8分别为0.15、0.20、0.25、0.30、0.30、0.35、0.55、0.60

我们通过计算得到损失函数Error = 1/2 ((m1- target1)2 + (m2 - target2)2) = 0.2988

w5和w7均可以通过求三次导来求梯度,而w1,w3则不能直接通过L降序求导,我们需要求从L到m1,m1到o1,o1到k1,k1到h1,h1到w1:

由于w1是输出两个方向分别到o1和o2,所以是两个方向的梯度求和~

我们也发现所以激活函数都是要可微的~

其他的网络参数更新过程和上面的求导过程是一样的,这里就不过多赘述,我们直接看一下代码。

反向传播代码 

我们先来回顾一些Python中类的一些小细节:

🌈在Python中,使用super()函数可以调用父类的方法。这在子类中重写父类方法时非常有用,因为它允许你调用父类的实现,而不是完全覆盖它

class Parent:def __init__(self):print("Parent init")class Child(Parent):def __init__(self):super().__init__()print("Child init")c = Child()# 输出
Parent init
Child init

🌈当我们创建一个Child类的实例时,它会首先调用Parent类的__init__方法(通过super().__init__()),然后执行Child类的__init__方法,与类的__init__方法(构造方法)对应的类关闭时自动调用的方法是__del__方法。对象不再被使用时,Python解释器会自动调用这个方法。通常在这个方法中进行一些清理工作,比如释放资源、关闭文件等。

反向传播实现

import torch
import torch.nn as nn
import torch.optim as optimclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.linear1 = nn.Linear(2, 2)self.linear2 = nn.Linear(2, 2)# 网络参数初始化w1/w2/w3/w4self.linear1.weight.data = torch.tensor([[0.15, 0.20], [0.25, 0.30]])# w5/w6/w7/w8self.linear2.weight.data = torch.tensor([[0.40, 0.45], [0.50, 0.55]])# 截距bself.linear1.bias.data = torch.tensor([0.35, 0.35])self.linear2.bias.data = torch.tensor([0.60, 0.60])# 定义前向传播的行径def forward(self, x):x = self.linear1(x)x = torch.sigmoid(x)x = self.linear2(x)x = torch.sigmoid(x)return xif __name__ == '__main__':inputs = torch.tensor([[0.05, 0.10]])target = torch.tensor([[0.01, 0.99]])# 获得网络输出值net = Net()output = net(inputs)# print(output)  # tensor([[0.7514, 0.7729]], grad_fn=<SigmoidBackward>)# 计算误差loss = torch.sum((output - target) ** 2) / 2# print(loss)  # tensor(0.2984, grad_fn=<DivBackward0>)# 优化方法optimizer = optim.SGD(net.parameters(), lr=0.5)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 打印 w5、w7、w1 的梯度值print(net.linear1.weight.grad.data)# tensor([[0.0004, 0.0009],#         [0.0005, 0.0010]])print(net.linear2.weight.grad.data)# tensor([[ 0.0822,  0.0827],#         [-0.0226, -0.0227]])# 打印网络参数optimizer.step()print(net.state_dict())# OrderedDict([('linear1.weight', tensor([[0.1498, 0.1996], [0.2498, 0.2995]])),#              ('linear1.bias', tensor([0.3456, 0.3450])),#              ('linear2.weight', tensor([[0.3589, 0.4087], [0.5113, 0.5614]])),#              ('linear2.bias', tensor([0.5308, 0.6190]))])
  • optimizer.step() 相当于是将w和b所有参数更新一步的过程

🌈关于nn.Linear的使用

import torch
import torch.nn.functional as F
import torch.nn as nn# 均匀分布随机初始化linear = nn.Linear(5, 3)
# 从0-1均匀分布产生参数
nn.init.uniform_(linear.weight)
print(linear.weight.data)

nn.Linear是PyTorch中用于创建线性层的类,也被称为全连接层。它的主要作用是将输入数据与权重矩阵相乘并加上偏置,然后通常会通过一个非线性激活函数进行转换。 

  1. 在函数内部,创建一个线性层,输入维度为5,输出维度为3;
  2. 使用nn.init.uniform_()函数对线性层的权重进行均匀分布随机初始化;
  3. 打印线性层的权重数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【限流】基于springboot(拦截器) + redis(执行lua脚本)实现注解限流

实现了滑动窗口&#xff0c;固定窗口&#xff0c;令牌桶&#xff0c;漏桶四种限流算法&#xff0c;并且支持各种扩展和修改&#xff0c;源码简单易上手。 Gitee&#xff1a;https://gitee.com/sir-tree/rate-limiter-spring-boot-starter 一、令牌桶算法—入桶量限制 在客户端…

品牌百度百科词条需要什么资料?

品牌百度百科词条是一个品牌的数字化名片&#xff0c;更是品牌历史、文化、实力的全面展现。 作为一个相当拿得出手的镀金名片&#xff0c;品牌百度百科词条创建需要什么资料&#xff0c;今天伯乐网络传媒就来给大家讲解一下。 一、品牌基本信息&#xff1a;品牌身份的明确 品…

【漏洞复现】科达 MTS转码服务器 任意文件读取漏洞

0x01 产品简介 科达 MTS转码服务器是一款专业的视频转码设备&#xff0c;采用了高性能的硬件配置和先进的转码技术&#xff0c;能够实现高效、高质量的视频转码。 0x02 漏洞概述 科达 MTS转码服务器存在任意文件读取漏洞&#xff0c;攻击可以通过该漏洞读取服务器任意敏感信…

FSD自动驾驶泛谈

特斯拉的FSD&#xff08;Full-Self Driving&#xff0c;全自动驾驶&#xff09;系统是特斯拉公司研发的一套完全自动驾驶系统。旨在最终实现车辆在多种驾驶环境下无需人类干预的自动驾驶能力。以下是对FSD系统的详细探讨&#xff1a; 系统概述 FSD是特斯拉的自动驾驶技术&…

宠物领养|基于SprinBoot+vue的宠物领养管理系统(源码+数据库+文档)

宠物领养目录 基于Spring Boot的宠物领养系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台 1.1 宠物领养 1.2 宠物认领 1.3 教学视频 2后台 2.1宠物领养管理 2.2 宠物领养审核管理 2.3 宠物认领管理 2.4 宠物认领审核管理 2.5 教学视频管理 四、…

英语学习笔记--发音-元音和辅音

以下所有内容来自“AI豆包”。 需要注意的是&#xff0c;以下发音类似仅为帮助你理解的中文发音示例&#xff0c;与英语元音的实际发音可能存在一定差异。如果你想更准确地学习英语元音的发音&#xff0c;建议你多听、多读、多模仿英语原声材料&#xff0c;并寻求专业英语教师…

零基础自学前端到达到什么水平才能找工作?

零基础自学前端到达到什么水平才能找工作&#xff1f; 零基础自学前端到达到什么水平才能找工作&#xff1f;从这个字眼的表面上来回答这个问题&#xff0c;但是是前端水平越高越好咯。前端技术人才只有不断通过学习、项目的事件来不断充实提高自己的技术&#xff0c;随之而来&…

【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化

🟣【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化 一、修改Jenkins插件下载地址二、汉化Jenkins三、关于Jenkins💖The Begin💖点点关注,收藏不迷路💖 一、修改Jenkins插件下载地址 由于Jenkins官方插件地址下载速度较慢,我们可以通过修改下载地址…

Jupyter 容器环境: Debian 11离线部署SSH Server总结

在基于continuumio/anaconda3镜像搭建的jupyter环境中,想在pycharm中进行远程debug代码,但容器中没有部署ssh server导致无法进行。 本文讲述如何在anaconda3容器中安装ssh server 安装步骤 修改云源 echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bulls…

Unity中WWWForm与 JsonUtility.ToJson区别

在Unity中&#xff0c;WWWForm 和 JsonUtility.ToJson 是两个用于处理网络请求中数据的工具&#xff0c;但它们的功能和用途有着显著的区别。 WWWForm WWWForm 是Unity早期版本中用于构建HTTP表单数据的类。它主要用于WWW类的POST请求&#xff0c;允许你添加表单字段&#xf…

6、FreeCAD的设计

一、FreeCAD的模块化设计&#xff08;插件系统&#xff09; 模块化设计是成功的软件架构的关键设计原则。FreeCAD采用了与Salome平台相似的模块化结构&#xff0c;后者是一个开源的CAE平台&#xff0c;包含几何建模、网格划分、FEM和CFD求解器模块。FreeCAD拥有生成新模块的基…

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…

Vue3 中setup模式下component标签 is属性动态绑定组件空白显示问题

先看官网说明&#xff1a; <!-- 组件会在 currentTabComponent 改变时改变 --> <component v-bind:is"currentTabComponent"></component>在上述示例中&#xff0c;currentTabComponent 可以包括 已注册组件的名字&#xff0c;或 一个组件的选项…

美国洛杉矶服务器托管需要了解什么?

美国洛杉矶拥有多个数据中心提供服务器托管服务&#xff0c;这些服务通常包括弹性云服务器、裸金属服务器等。以下是一些关于美国洛杉矶服务器托管的详细信息&#xff0c;rak部落小编为您整理发布。 1. **数据中心分布**&#xff1a;在洛杉矶有多处数据中心&#xff0c;它们提供…

CVPR 小样本土地覆盖制图 张洪艳教授团队获挑战赛冠军

提出了一个广义的基于少镜头分割的框架&#xff0c;以更新高分辨率土地覆盖制图中的新类&#xff0c;分为三个部分:(a)数据预处理:对基础训练集和新类的少镜头支持集进行分析和扩充;(b)混合分割结构:将多基学习器和改进的投影到正交原型(POP)网络相结合&#xff0c;增强基类识别…

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color&#xff1a;设置文本颜色。 8.font-family&#xff1a;设置字体系列。 9.font-size&#xff1a;设置字体大小。…

Laravel5.4 反序列化

文章目录 0x01 环境搭建0x02 POP 链0x03 exp0x04 总结 前言&#xff1a;CC 链复现的头晕&#xff0c;还是从简单的 Laravel 开始吧。 laravel 版本&#xff1a;5.4 0x01 环境搭建 laravel安装包下载地址 安装后配置验证页面。在 /routes/web.php 文件中添加一条路由&#xf…

数据库基础--MySQL简介以及基础MySQL操作

数据库概述 数据库&#xff08;DATABASE&#xff0c;简称DB&#xff09; 定义:是按照数据结构来组织、存储和管理数据的仓库.保存有组织的数据的容器(通常是一个文件或一组文件) 数据库管理系统(Database Management System,简称DBMS) 专门用于管理数据库的计算机系统软件;…

共享旅游卡项目如何做线上运营?分享运营的3个核心点!

疫情三年下来&#xff0c;还能保持活跃的实体行业&#xff0c;可能就是旅游行业。别看很多美食餐饮的&#xff0c;看起来很赚钱&#xff0c;除开成本&#xff0c;其实也是赚点辛苦钱。 从2023年疫情放开&#xff0c;很多人都涌入到旅游行业。但因为绝大多数都是门外汉&#xf…

iBarcoder for Mac:一站式条形码生成软件

在数字化时代&#xff0c;条形码的应用越来越广泛。iBarcoder for Mac作为一款专业的条形码生成软件&#xff0c;为用户提供了一站式的解决方案。无论是零售、出版还是物流等行业&#xff0c;iBarcoder都能轻松应对&#xff0c;助力用户实现高效管理。 iBarcoder for Mac v3.14…