在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 socket多线程通讯实例分析(聊天室)
Apr 06 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
Django自定义分页效果
Jun 27 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
python清除字符串前后空格函数的方法
Oct 21 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python程序快速缩进多行代码方法总结
Jun 23 Python
python实现各种插值法(数值分析)
Jul 30 Python
python实现数字炸弹游戏程序
Jul 17 Python
Python Selenium库的基本使用教程
Jan 04 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php代码把全角数字转为半角数字
2007/12/10 PHP
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
PHP四大安全策略
2014/03/12 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
php的对象传值与引用传值代码实例讲解
2021/02/26 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
javascript+mapbar实现地图定位
2010/04/09 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
微信小程序之GET请求的实例详解
2017/09/29 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
在Python中操作字符串之replace()方法的使用
2015/05/19 Python
Python正则表达式匹配中文用法示例
2017/01/17 Python
关于Python数据结构中字典的心得
2017/12/04 Python
python实现石头剪刀布程序
2021/01/20 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
巧用HTML5给按钮背景设计不同的动画简单实例
2016/08/09 HTML / CSS
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
外贸业务员求职自荐信分享
2013/09/21 职场文书
大学毕业生简单自荐信
2013/11/05 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
职工擅自离岗检讨书
2014/09/23 职场文书
离婚协议书范本2014
2014/10/27 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
解决jupyter notebook启动后没有token的坑
2021/04/24 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
Tomcat弱口令复现及利用
2022/05/06 Servers