使用PyTorch构建神经网络以及反向传播计算
使用PyTorch构建神经网络以及反向传播计算
前一段时间南京出现了疫情,大概原因是因为境外飞机清洁处理不恰当,导致清理人员感染。话说国外一天不消停,国内就得一直严防死守。沈阳出现了一例感染人员,我在22号乘坐飞机从沈阳乘坐飞机到杭州,恰好我是一位密切接触人员的后三排,就这样我成为了次密切接触人员,人下飞机刚到杭州就被疾控中心带走了,享受了全免费的隔离套餐,不得不说疾控中心大数据把控是真的有力度。在这一段时间,也让我沉下心来去做了点事,之前一直鸽的公众号也开始写上了。。。不过隔离期间确实让我这么宅的人都感觉很憋。。。唠唠叨叨这么多,言归正传,这节将从反向传播算法进一步分析基于PyTorch的神经网络算法。
构建神经网络
在训练神经网络时,常用的算法是反向传播。该算法中,参数根据损失函数相对应的给定的参数的梯度进行调整。为了计算这些梯度,使用PyTorch的内置函数torch.autograd。它支持任何网络的梯度计算。
通过构建一层神经网络来进行细致的分析;
import torch
x = torch.ones(5) # input tensor
y = torch.zeros(3) # expected output
w = torch.randn(5, 3, requires_grad=True)
b = torch.randn(3, requires_grad=True)
z = torch.matmul(x, w)+b
loss = torch.nn.functional.binary_cross_entropy_with_logits(z, y)
通过PyTorch定义具有输入x,参数w,b以及损失函数,进而构建一层神经网络。
张量,函数,计算图

print('Gradient function for z =',z.grad_fn)
print('Gradient function for loss =', loss.grad_fn)
输出结果如下;

我们通过张量来构建计算图函数本质是Function的对象。该对象定义了前向计算函数,在反向传播中计算导数。将反向传播函数存储在grad_fn中。
参考PyTorch文档https://pytorch.org
在整个网络中,w,b是需要优化的参数。为了计算这些参数的损失函数的梯度,设置了requires_grad这些张量的属性。
计算梯度
梯度,本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大。
为了优化神经网络参数的权重,需要计算损失函数关于参数的导数,通过loss.backward() 进行计算。
loss.backward()
print(w.grad)
print(b.grad)
输出结果如下;

我们只能获取grad计算图的叶子节点的requeires_grad属性,这些属性设置为True。backward只能在图中使用一次梯度计算,如果需要backward在同一个图多次调用,我们需要传递retain_graph-True和backward调用
更多图计算
从概念上讲,autograd 在由Function 对象组成的有向无环图 (DAG) 中保存数据(张量)和所有已执行操作(以及生成的新张量)的记录 。在这个 DAG 中,叶子是输入张量,根是输出张量。通过从根到叶跟踪此图,可以使用链式法则自动计算梯度。
在前向传递过程,autograd需要计算结果张量,在DAG中保持梯度函数
在DAG中调用abckward() 需要计算各自的梯度,将其累计在各自的grad属性中,使用链式法则,传递到叶张量。
DAG是动态的,每次调用backward()函数,autograd开始填充新图形,如果需要可以在每次迭代时进行操作。
梯度以及雅可比积
梯度,张量在任意常数c方向上的梯度:n阶张量的梯度是n+1张量场。
雅可比积是表示两个向量的所有可能偏导数的矩阵。它是一个向量相对于另一个向量的梯度,Autograd可以对张量进行微分,从一个变量开始执行反向传播。在深度学习中,这个变量通常保存成本函数的值,自动计算所有反向传播梯度

计算雅可比乘积而不是计算雅可比矩阵本身;
计算成绩如下所示
inp = torch.eye(5, requires_grad=True)
out = (inp+1).pow(2)
out.backward(torch.ones_like(inp), retain_graph=True)
print("First call\n", inp.grad)
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nSecond call\n", inp.grad)
inp.grad.zero_()
out.backward(torch.ones_like(inp), retain_graph=True)
print("\nCall after zeroing gradients\n", inp.grad)

当backward使用相同的参数进行第二次调用时,梯度的值是不同的。发生这种情况是因为在进行反向传播时,PyTorch会积累梯度,即将梯度的值添加到grad图计算中所有节点的属性中。如果要计算适当的梯度,需要将grad归零。
结语
关于禁用渐变跟踪问题上,有时我们不需要跟踪计算所有计算历史,将神经网络某些参数固定是微调神经网络常用方法,而且在仅向前传递时加快计算速度。
在图计算问题上,autograd 在由Function 对象组成的有向无环图 (DAG) 中保存数据(张量)和所有已执行操作(以及生成的新张量)的记录 。在这个 DAG 中,叶子是输入张量,根是输出张量。通过从根到叶跟踪此图,您可以使用链式法则自动计算梯度。前向传递,autograd计算结果张量,在dag中维护操作的梯度函数,在反向传递中,计算每个梯度.grad_fn,将他们积累到.grad属性中,使用链式法则传播到叶张量。下一节将从优化模型参数角度进行学习
参考开发文档:https://pytorch.org/tutorials/beginner/basics/buildmodel_tutorial.html
推荐阅读
使用PyTorch构建神经网络以及反向传播计算的更多相关文章
- 深度学习与CV教程(4) | 神经网络与反向传播
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 关于 RNN 循环神经网络的反向传播求导
关于 RNN 循环神经网络的反向传播求导 本文是对 RNN 循环神经网络中的每一个神经元进行反向传播求导的数学推导过程,下面还使用 PyTorch 对导数公式进行编程求证. RNN 神经网络架构 一个 ...
- Andrej Karpathy | 详解神经网络和反向传播(基于 micrograd)
只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...
- 使用pytorch构建神经网络的流程以及一些问题
使用PyTorch构建神经网络十分的简单,下面是我总结的PyTorch构建神经网络的一般过程以及我在学习当中遇到的一些问题,期望对你有所帮助. PyTorch构建神经网络的一般过程 下面的程序是PyT ...
- 神经网络之反向传播算法(BP)公式推导(超详细)
反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...
- NLP教程(3) | 神经网络与反向传播
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...
- PyTorch深度学习实践——反向传播
反向传播 课程来源:PyTorch深度学习实践--河北工业大学 <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili 目录 反向传播 笔记 作业 笔记 在之前课程中介绍的线性 ...
- AI之旅(7):神经网络之反向传播
前置知识 求导 知识地图 神经网络算法是通过前向传播求代价,反向传播求梯度.在上一篇中介绍了神经网络的组织结构,逻辑关系和代价函数.本篇将介绍如何求代价函数的偏导数(梯度). 梯度检测 在 ...
- 神经网络中误差反向传播(back propagation)算法的工作原理
注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...
随机推荐
- rem.js,移动多终端适配
window.onload = function(){ /*720代表设计师给的设计稿的宽度,你的设计稿是多少,就写多少;100代表换算比例,这里写100是 为了以后好算,比如,你测量的一个宽度是10 ...
- javaAPI2
---------------------------------------------------------------------------------------------------- ...
- 最小化安装centos ubuntu基础命令
# yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre \ pcre-devel openssl openssl-devel zip ...
- GO类型转换
golang []byte转string golang中,字符切片[]byte转换成string最简单的方式是 package main import ( "fmt" _ &quo ...
- react中在hooks方法useEffect中加载异步数据
useEffect( ()=>{ (async function getPipeList(value:any) { let result= await GetPipeList(value); s ...
- NoSQL之Redis学习笔记
一.NoSQL与Redis 1.什么是NoSQL? NoSQL=Not Only SQL ,泛指非关系型数据库.随着互联网的兴起,传统的关系型数据库已经暴露了很多问题,NoSQL数据库的产生就是为了解 ...
- c3p0的使用步骤
//1.导入c3p0的连个包,和mysql的驱动包//2.配置c3p0.xml的配置文件 <c3p0-config> <!-- 使用默认的配置读取连接池对象 --> <d ...
- 【C++】最长回文子串/动态规划
ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...
- tableau创建点位地图
一.双击省/自治区字段 二.双击销售额字段,标记类型改为圆 三.省/自治区字段设置标签显示,圆的大小和颜色细节调整,最终结果如下图所示
- C# 扫描识别图片中的文字(.NET Framework)
环境配置 本文以C#及VB.NET代码为例,介绍如何扫描并读取图片中的文字. 本次程序环境如下: Visual Studio版本要求不低于2017 图片扫描工具:Spire.OCR for .NET ...
