使用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

在整个网络中,wb是需要优化的参数。为了计算这些参数的损失函数的梯度,设置了requires_grad这些张量的属性。

计算梯度

梯度,本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大。

为了优化神经网络参数的权重,需要计算损失函数关于参数的导数,通过loss.backward() 进行计算。

loss.backward()
print(w.grad)
print(b.grad)

输出结果如下;

我们只能获取grad计算图的叶子节点的requeires_grad属性,这些属性设置为True。backward只能在图中使用一次梯度计算,如果需要backward在同一个图多次调用,我们需要传递retain_graph-Truebackward调用

更多图计算

从概念上讲,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构建神经网络以及反向传播计算的更多相关文章

  1. 深度学习与CV教程(4) | 神经网络与反向传播

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  2. 关于 RNN 循环神经网络的反向传播求导

    关于 RNN 循环神经网络的反向传播求导 本文是对 RNN 循环神经网络中的每一个神经元进行反向传播求导的数学推导过程,下面还使用 PyTorch 对导数公式进行编程求证. RNN 神经网络架构 一个 ...

  3. Andrej Karpathy | 详解神经网络和反向传播(基于 micrograd)

    只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...

  4. 使用pytorch构建神经网络的流程以及一些问题

    使用PyTorch构建神经网络十分的简单,下面是我总结的PyTorch构建神经网络的一般过程以及我在学习当中遇到的一些问题,期望对你有所帮助. PyTorch构建神经网络的一般过程 下面的程序是PyT ...

  5. 神经网络之反向传播算法(BP)公式推导(超详细)

    反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是"误差反向传播"的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见 ...

  6. NLP教程(3) | 神经网络与反向传播

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...

  7. PyTorch深度学习实践——反向传播

    反向传播 课程来源:PyTorch深度学习实践--河北工业大学 <PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili 目录 反向传播 笔记 作业 笔记 在之前课程中介绍的线性 ...

  8. AI之旅(7):神经网络之反向传播

    前置知识   求导 知识地图   神经网络算法是通过前向传播求代价,反向传播求梯度.在上一篇中介绍了神经网络的组织结构,逻辑关系和代价函数.本篇将介绍如何求代价函数的偏导数(梯度). 梯度检测   在 ...

  9. 神经网络中误差反向传播(back propagation)算法的工作原理

    注意:版权所有,转载需注明出处. 神经网络,从大学时候就知道,后面上课的时候老师也讲过,但是感觉从来没有真正掌握,总是似是而非,比较模糊,好像懂,其实并不懂. 在开始推导之前,需要先做一些准备工作,推 ...

随机推荐

  1. 【Reverse】初遇花指令

    解密花指令 全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393 介绍 花指令是对抗反汇编的有效 ...

  2. pyqt5的下拉菜单,可以进行输入文字

  3. linux安装redis报错

    问题:You need tcl 8.5 or newer in order to run the Redis test 解决办法: wget http://downloads.sourceforge. ...

  4. Objective-C运行时定义了几种重要的类型

    Objective-C运行时定义了几种重要的类型. Class:定义Objective-C类 Ivar:定义对象的实例变量,包括类型和名字. Protocol:定义正式协议. objc_propert ...

  5. Dubbo服务限流

    为了防止某个消费者的QPS或是所有消费者的QPS总和突然飙升而导致的重要服务的失效,系统可以对访问流量进行控制,这种对集群的保护措施称为服务限流. Dubbo中能够实现服务限流的方式较多,可以划分为两 ...

  6. Lock 锁的实现

    锁的种类 自旋锁(spinlock):无法获得锁,就一直循环获取,适合短时间的加锁 睡眠锁(sleeplock):为了防止长时间的循环等待,在获取不到锁时,进程陷入睡眠,当锁释放时对睡眠进程进行唤醒 ...

  7. Linux下安装Calibre

    目录 一.介绍 二.安装 三.测试 四.报错处理 一.介绍 Calibre是基于python的电子书制作软件,可导出PDF.EPUB.MOBI.Word格式电子书. 二.安装 yum -y insta ...

  8. Python绘制柱状图

    1.1Python绘制柱状图对应代码如下所示 import matplotlib.pyplot as plt import numpy as np from pylab import mpl mpl. ...

  9. [BUUCTF]PWN——level4

    level4 附件 步骤: 例行检查,32位程序,开启了NX保护 运行一下程序,看看大概的情况 32位ida载入,首先检索程序里的字符串,根据上一步运行看到的字符串进行跳转 输入点在function里 ...

  10. pdf2swf转换不成功该怎么解决啊,Process p=r.exec("D:/swf/pdf2swf.exe \""+pdfFile.getPath()+"\" -o \""+swfFile.getPath()+"\" -T 9");

    pdf2swf转换不成功该怎么解决啊,可以这样解决吧,请注意命令的用法啊:Process p=r.exec("D:/swf/pdf2swf.exe  \""+pdfFil ...