在pytorch中实现只让指定变量向后传播梯度


Posted in Python onFebruary 29, 2020

pytorch中如何只让指定变量向后传播梯度?

(或者说如何让指定变量不参与后向传播?)

有以下公式,假如要让L对xvar求导:

在pytorch中实现只让指定变量向后传播梯度

(1)中,L对xvar的求导将同时计算out1部分和out2部分;

(2)中,L对xvar的求导只计算out2部分,因为out1的requires_grad=False;

(3)中,L对xvar的求导只计算out1部分,因为out2的requires_grad=False;

验证如下:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Wed May 23 10:02:04 2018
@author: hy
"""
 
import torch
from torch.autograd import Variable
print("Pytorch version: {}".format(torch.__version__))
x=torch.Tensor([1])
xvar=Variable(x,requires_grad=True)
y1=torch.Tensor([2])
y2=torch.Tensor([7])
y1var=Variable(y1)
y2var=Variable(y2)
#(1)
print("For (1)")
print("xvar requres_grad: {}".format(xvar.requires_grad))
print("y1var requres_grad: {}".format(y1var.requires_grad))
print("y2var requres_grad: {}".format(y2var.requires_grad))
out1 = xvar*y1var
print("out1 requres_grad: {}".format(out1.requires_grad))
out2 = xvar*y2var
print("out2 requres_grad: {}".format(out2.requires_grad))
L=torch.pow(out1-out2,2)
L.backward()
print("xvar.grad: {}".format(xvar.grad))
xvar.grad.data.zero_()
#(2)
print("For (2)")
print("xvar requres_grad: {}".format(xvar.requires_grad))
print("y1var requres_grad: {}".format(y1var.requires_grad))
print("y2var requres_grad: {}".format(y2var.requires_grad))
out1 = xvar*y1var
print("out1 requres_grad: {}".format(out1.requires_grad))
out2 = xvar*y2var
print("out2 requres_grad: {}".format(out2.requires_grad))
out1 = out1.detach()
print("after out1.detach(), out1 requres_grad: {}".format(out1.requires_grad))
L=torch.pow(out1-out2,2)
L.backward()
print("xvar.grad: {}".format(xvar.grad))
xvar.grad.data.zero_()
#(3)
print("For (3)")
print("xvar requres_grad: {}".format(xvar.requires_grad))
print("y1var requres_grad: {}".format(y1var.requires_grad))
print("y2var requres_grad: {}".format(y2var.requires_grad))
out1 = xvar*y1var
print("out1 requres_grad: {}".format(out1.requires_grad))
out2 = xvar*y2var
print("out2 requres_grad: {}".format(out2.requires_grad))
#out1 = out1.detach()
out2 = out2.detach()
print("after out2.detach(), out2 requres_grad: {}".format(out1.requires_grad))
L=torch.pow(out1-out2,2)
L.backward()
print("xvar.grad: {}".format(xvar.grad))
xvar.grad.data.zero_()

pytorch中,将变量的requires_grad设为False,即可让变量不参与梯度的后向传播;

但是不能直接将out1.requires_grad=False;

其实,Variable类型提供了detach()方法,所返回变量的requires_grad为False。

注意:如果out1和out2的requires_grad都为False的话,那么xvar.grad就出错了,因为梯度没有传到xvar

补充:

volatile=True表示这个变量不计算梯度, 参考:Volatile is recommended for purely inference mode, when you're sure you won't be even calling .backward(). It's more efficient than any other autograd setting - it will use the absolute minimal amount of memory to evaluate the model. volatile also determines that requires_grad is False.

以上这篇在pytorch中实现只让指定变量向后传播梯度就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之python消息摘要算法使用示例
Feb 10 Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python生成随机密码的方法
Jun 16 Python
利用django如何解析用户上传的excel文件
Jul 24 Python
python连接数据库的方法
Oct 19 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
Python2和Python3.6环境解决共存问题
Nov 09 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
Python使用pdb调试代码的技巧
May 03 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
Matplotlib animation模块实现动态图
Feb 25 Python
python pyg2plot的原理知识点总结
Feb 28 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 #Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 #Python
python实现门限回归方式
Feb 29 #Python
Python3.9又更新了:dict内置新功能
Feb 28 #Python
python实现logistic分类算法代码
Feb 28 #Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 #Python
使用sklearn的cross_val_score进行交叉验证实例
Feb 28 #Python
You might like
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
JavaScript更改class和id的方法
2008/10/10 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
初窥JQuery(一)jquery选择符 必备知识点
2010/11/25 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
JavaScript学习总结之JS、AJAX应用
2016/01/29 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
AngularJS中如何使用echart插件示例详解
2016/10/26 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
python的等深分箱实例
2019/11/22 Python
python和go语言的区别是什么
2020/07/20 Python
现代化办公人员工作的自我评价
2013/10/16 职场文书
小学新教师培训方案
2014/02/03 职场文书
护士工作失误检讨书
2014/09/14 职场文书
市级三好学生评语
2014/12/29 职场文书
街道社区活动报告
2015/02/05 职场文书
歌剧魅影观后感
2015/06/05 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python