在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下singleton模式的实现方法
Jul 16 Python
python下MySQLdb用法实例分析
Jun 08 Python
Python 文件处理注意事项总结
Apr 10 Python
5款非常棒的Python工具
Jan 05 Python
Python爬虫将爬取的图片写入world文档的方法
Nov 07 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
Django项目后台不挂断运行的方法
Aug 31 Python
多个python文件调用logging模块报错误
Feb 12 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
python suds访问webservice服务实现
Jun 26 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
5 分钟读懂Python 中的 Hook 钩子函数
Dec 09 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使用MySQL保存session会话的方法
2015/06/26 PHP
PHP消息队列用法实例分析
2016/02/12 PHP
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
浅谈tudou土豆网首页图片延迟加载的效果
2010/06/23 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
JavaScript+html5 canvas制作的百花齐放效果完整实例
2016/01/26 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
python读写文件操作示例程序
2013/12/02 Python
python的绘图工具matplotlib使用实例
2014/07/03 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Keras模型转成tensorflow的.pb操作
2020/07/06 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
关键字throw与throws的用法差异
2016/11/22 面试题
临床医师专业个人自我评价范文
2013/11/07 职场文书
大学毕业通用个人的求职信
2013/12/08 职场文书
计算机个人求职信范例
2014/01/24 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
网络技术专业求职信
2014/02/18 职场文书
热门专业求职信
2014/05/24 职场文书
职工小家建设活动方案
2014/08/25 职场文书
老人节标语大全
2014/10/08 职场文书
民事答辩状格式范文
2015/05/21 职场文书
学校远程教育工作总结
2015/08/11 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers