【神经网络 基础知识整理】前向传播 反向传播

神经网络 基础知识整理

  • 前向传播
    • 前向传播
    • pytorch中的forward函数
  • 反向传播

顾名思义,前向传播是从前往后传播的,从input层到output层的方向:前面一层的输出传入后一层作为输入,再对数据进行相应的处理,继续传下去,直到输出层;反向传播是从后往前传播的,从output层到input层的方向:目标函数(对应的损失函数)对某权重or某偏置(即神经网络中可训练的参数)求偏导,根据链式法则,从后往前计算偏导

前向传播

前向传播

我们以多层感知机(MLP)为例子,来看看前向传播的过程:神经网络分为3层(输入层、中间层=隐藏层、输出层),数据分别用X、A、Y表示,输入是1*3的向量,中间层有4个神经元节点,输出有2个神经元(比如二分类任务)。X输入然后经过线性变换+非线性变换(激活函数)得到A,A再经过线性变换+非线性变换得到Y,Y经过非线性变换得到最终的输出,整个过程就是前向传播的过程。
在这里插入图片描述
我们来看看a1、a2、a3、a4具体的计算式子,用W表示权重,B表示偏置,表示成矩阵运算即A=f(WX+B),其中A是1*4的向量,W是4*3的矩阵,4对应着输出节点数量,3对应着输入节点数量【权重矩阵W的维度表示成m*n的话,m对应着i+1层网络层的维度,n对应着i层网络层的维度】,f是激活函数:
在这里插入图片描述
最后输出Y的计算式子:
在这里插入图片描述

pytorch中的forward函数

首先说说python中的__call__()方法,这个方法使得一个类(假设是MyClass)的实例化对象(myclass)可以直接用myclass()调用__call__()方法,而不需要myclass.__call__()这样显示调用。以下代码的输出是调用了__call__函数, 其中age=23, name=Eliy,可见myclass()等于myclass.__call__():

class MyClass:def __call__(self, age, name) -> Any:print(f"调用了__call__函数, 其中age={age}, name={name}")if __name__ == '__main__':mycalss = MyClass()# 观察是否会调用__call__()mycalss(age=23, name= 'Eliy')

pytorch中自定义的网络结构都需要继承nn.Module类,这个类里面有self.forward()函数,自定义类需要重写这个函数,具体内容是实现前向传播。用resnet网络为例,forward函数内容如此:

    def forward(self, x):# 忽略每一层的具体结构,观察输入x的流向# 前向传播就是output = model(input)的数据处理过程out = F.relu(self.bn1(self.conv1(x)))out = self.layer1(out)out = self.layer2(out)out = self.layer3(out)out = self.layer4(out)out = F.avg_pool2d(out, 4)out = out.view(out.size(0), -1)out = self.fc(out)return out

需要注意的是,在nn.Module类中的__call__()方法里面,会去调用nn.Module的forward()方法,因此要得到自己model的输出,不必显式调用model.forward(input),直接model(input),此时会调用__call__(),进一步调用forward()。

反向传播

反向传播算法(back propagation),全称是误差反向传播算法,这里的误差实际就是目标函数/损失函数,即模型的输出y’与真实标签y之间的误差。反向传播算法通过使用链式法则,从网络的输出层开始,沿着网络的连接逐层向后计算梯度。这个过程实际上就是计算损失函数对于每个参数的偏导数,然后将这些偏导数整合成梯度。这些梯度随后可以被用于梯度下降等优化算法中,来更新网络参数以最小化损失函数。 反向传播算法与梯度下降算法结合使用,用于训练神经网络模型,具体来说是,反向传播算法计算梯度下降算法所需要的梯度。

因为模型中有很多可训练参数(假设用W表示),因此损失函数E是关于W的多元函数,高等数学学习了多元函数求偏导的方法,以及符合函数求导的链式法则,反向传播求梯度需要用到这些知识。 假设y=f(u(x)),求关于x的导数,如下:
在这里插入图片描述
我们按照第一张图片给出的三层神经网络,以MSE作为损失函数(假设这里是二分类用softmax作为激活函数的话,输出是(y1,y2)这样的向量,计算MSE就逐元素相减,再平方再相加),具体以反向传播计算w1_11的偏导为例:
在这里插入图片描述

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

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

相关文章

力扣Lc17--- 345.反转字符串中的元音字母(java版)-2024年3月18日

1.题目 2.知识点 注1: indexOf() 是 Java 中 String 类的方法之一,它用于查找指定字符或字符串在字符串中第一次出现的位置。如果找到了该字符或字符串,则返回它在字符串中的索引位置(从0开始),如果没有找…

Qt的多线程类

主要介绍一些Qt的多线程类 QThread QThread 是 Qt 提供的基本的多线程类&#xff0c;它允许创建自定义的线程。可以继承 QThread 类&#xff0c;并重写其 run() 方法&#xff0c;在 run() 方法中编写线程要执行的代码。以下是一个简单的示例&#xff1a; #include <QThre…

03、判断和循环

三、判断与循环 文章目录 三、判断与循环顺序结构分支结构If语句在程序中就是用来判断的switch 循环结构forwhiledo while 顺序结构 顺序结构是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 分支结构 If语句在程序中就是用来判断的 …

C语言 实用调试技巧

我们的博客已经更新到了数据结构&#xff0c;但是当我在深耕数据结构时我发现我在C语言是遗漏了一个重要的东西&#xff0c;那就是C语言的使用调试技巧。这篇博客对数据结构非常重要&#xff0c;请大家耐心观看。 1. 什么是bug&#xff1f; 第一次被发现的导致计算机错误的飞蛾…

抖音小店怎么高效的对接达人?分享四年老运营的经验,可记笔记!

大家好&#xff0c;我是电商糖果 抖音现在最火的卖货方式&#xff0c;依旧是达人带货&#xff0c;也就是商家和达人合作模式。 有很多刚开店的朋友找达人合作总是失败&#xff0c;不知道什么原因。 其实找达人合作是需要技巧的&#xff0c;糖果做抖音小店已经四年了&#xf…

Vue2 基础三组件化开发

代码下载 组件 (Component) 是 Vue.js 最强大的功能之一&#xff0c;组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。 组件注册 全局注册&#xff1a; Vue.component(组件名称, {data: 组件数据,template: 组件模板内容});// 全局组件Vue.component(button-counter, …

在AI创业热潮下,如何抓住AI赚钱机会,实现人生逆袭

随着人工智能技术的迅猛发展,AI创业热潮正席卷全球。这不仅为科技领域的专业人士提供了无限的商机,也为普通人开辟了全新的赚钱途径。本文将为您揭示在AI创业热潮下,普通人如何抓住AI赚钱机会,实现人生逆袭,同时探讨哪些行业适合应用AI技术。 一、普通人如何抓住AI赚钱机…

前端基础篇-快速了解 Vue 前端框架(Vue 指令)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Vue 概述 2.0 Vue 指令 2.1 指令 - v-bind 2.2 指令 - v-model 2.3 指令 - v-on 2.4 指令 - v-if、v-else-if、v-else 2.5 指令 - v-show 2.6 指令 - v-for 3.0 生…

实现C++自定义的String类

一、简介 采用了COW写时复制的方式实现&#xff0c;即在每个String类数据域之前用了4个字节的空间进行引用计数。通过拷贝构造函数或者赋值运算符函数进行赋值时不会重新开辟空间&#xff0c;只会对引用计数加一&#xff0c;当有修改操作时&#xff0c;才会重新开辟新的空间&a…

es文档操作命令

文档操作 documents 创建数据&#xff08;put&#xff09; 向 user 索引下创建3条数据 PUT /user/_doc/1 {"name":"zhangsan","age":18,"sex":"男","info":"一顿操作猛如虎&#xff0c;一看工资2500"…

码云简化版使用教程

码云简化版使用教程 ①创建本地项目 ②在本地项目根目录下创建git相关目录及文件 ③在码云上创建新的仓库 ④在本地项目中配置仓库地址&#xff0c;提交项目内容 下面直接从第二步开始讲解 在本地项目根目录下创建git相关目录及文件 1、打开项目根目录&#xff0c;进入cmd界…

Linux应用 线程同步之互斥锁

1、概念 1.1 定义 互斥锁&#xff08;Mutex&#xff09;&#xff0c;又称互斥型信号量&#xff0c;是一种特殊的二值性信号量&#xff0c;主要用于实现对共享资源的独占式处理。任意时刻&#xff0c;互斥锁的状态只有两种&#xff1a;开锁或闭锁。当有任务持有时&#xff0c;…

旧衣服回收小程序开发,“互联网+”模式下巨大收益

近年来&#xff0c;在人们生活水平的提高下&#xff0c;旧衣物随之增加&#xff0c;如何处理旧衣服成为了当下大众所困扰的问题。 当下&#xff0c;旧衣回收行业已经成为了一个新的热门行业&#xff0c;我国人口众多&#xff0c;旧衣物的市场规模也在不断扩大&#xff0c;市场…

【QT入门】qmake和cmake的简单区别

声明&#xff1a;该专栏为本人学习Qt知识点时候的笔记汇总&#xff0c;希望能给初学的朋友们一点帮助(加油&#xff01;) 往期回顾&#xff1a; 【QT入门】Windows平台下 QT的编译过程-CSDN博客 【QT入门】VS2019QT的开发环境配置-CSDN博客 【QT入门】VS2019和QT Creator如何添…

基于springboot+vue的房屋交易平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

代码随想录算法训练营Day48 | LeetCode121. 买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II

LeetCode121. 买卖股票的最佳时机 动规五部曲&#xff1a; 1、dp[i][0]:在第i天持有股票的最大收入&#xff1b;dp[i][1]:在第i天不持有股票的最大收入。 2、递推公式&#xff1a;第i天持有股票&#xff0c;有两种情况&#xff1a;前一天已经持有&#xff0c;当天刚买入&#…

Greetings

Problem - 1915F - Codeforces 题意 给一些(l,r)找到所有能够包含(l,r)的数目 引入 也就是找逆序对个数 要用到归并排序中的思想&#xff1a; //https://www.luogu.com.cn/problem/P1216 #include<iostream> #include<cstdio> #include<stack> #include…

用python如何实现智能合约?如何使用remix编写solidity智能合约并部署上链

目录 用python如何实现智能合约? 直接展示下成功界面 下面分步骤说: remix代码 python链接remix代码

将查询出来数据中相对应的字段根据枚举类更改为其中文内容

&#x1f413;1.通过mapper.xml文件中的内容使用casewhen进行更换字段内容 SELECT case user_type when 101000 then 李明 when 101001 then 王丽 when 101002 then 王小黑 when 101003 then 王大黑 when 101004 then 超级大王 when 101005 then 小董 else end as 别称 from…

python面向对像之第二次笔记

python面向对像 一、面向对象的三大特性面向对象包含3大主要特性&#xff1a;封装私有成员继承复写 pass关键字多态 总结 一、面向对象的三大特性 面向对象包含3大主要特性&#xff1a; 封装 封装是面向对象编程中的一个重要概念&#xff0c;它指的是将数据&#xff08;属性&a…