在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实现测试磁盘性能的方法
Mar 12 Python
利用Celery实现Django博客PV统计功能详解
May 08 Python
Python正则捕获操作示例
Aug 19 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
Mar 29 Python
flask中的wtforms使用方法
Jul 21 Python
python利用requests库模拟post请求时json的使用教程
Dec 07 Python
python多线程抽象编程模型详解
Mar 20 Python
python requests指定出口ip的例子
Jul 25 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
opencv-python 提取sift特征并匹配的实例
Dec 09 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
python温度转换华氏温度实现代码
Dec 06 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动态生成VRML网页
2006/10/09 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
php 三元运算符实例详细介绍
2016/12/15 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
层序遍历在ExtJs的TreePanel中的应用
2009/10/16 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
Web前端框架bootstrap实战【第一次接触使用】
2016/12/28 Javascript
jquery实现tab键进行选择后enter键触发click行为
2017/03/29 jQuery
JavaScript生成图形验证码
2020/08/24 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
python实现得到一个给定类的虚函数
2014/09/28 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
Python使用线程来接收串口数据的示例
2019/07/02 Python
Pycharm及python安装详细教程(图解)
2020/07/31 Python
Johnston & Murphy官网: 约翰斯顿·墨菲牛津总统鞋
2018/01/09 全球购物
前台接待岗位职责
2013/12/03 职场文书
大学生军训广播稿
2014/01/24 职场文书
小学教师办公室制度
2014/02/03 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
安全教育主题班会总结
2015/08/14 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript