在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使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
浅谈function(函数)中的动态参数
Apr 30 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
python单例模式的多种实现方法
Jul 26 Python
python 列表推导式使用详解
Aug 29 Python
利用python实现PSO算法优化二元函数
Nov 13 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
python 实用工具状态机transitions
Nov 21 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
Python 带星号(* 或 **)的函数参数详解
Feb 23 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
PHP实现中国公民身份证号码有效性验证示例代码
2017/05/03 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
Javascript 作用域使用说明
2009/08/13 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
javascript中IE浏览器不支持NEW DATE()带参数的解决方法
2012/03/01 Javascript
js onload事件不起作用示例分析
2013/10/09 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
javascript面向对象三大特征之封装实例详解
2019/07/24 Javascript
vue实现计步器功能
2019/11/01 Javascript
JavaScript实现图片合成下载的示例
2020/11/19 Javascript
Python的Django框架使用入门指引
2015/04/15 Python
python集合用法实例分析
2015/05/30 Python
Python中取整的几种方法小结
2017/01/06 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
python numpy元素的区间查找方法
2018/11/14 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
python topk()函数求最大和最小值实例
2020/04/02 Python
python判断元素是否存在的实例方法
2020/09/24 Python
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
销售主管岗位职责
2014/02/08 职场文书
遗产继承公证书
2014/04/09 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
小学感恩节活动总结
2015/03/24 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
任长霞观后感
2015/06/16 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
HTML 里 img 元素的 src 和 srcset 属性的区别详解
2023/05/21 HTML / CSS