在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的即时标记项目练习笔记
Sep 18 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
详解Python开发中如何使用Hook技巧
Nov 01 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
Python如何读取文件中图片格式
Jan 13 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
Python 如何在字符串中插入变量
Aug 01 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 Python
总结三种用 Python 作为小程序后端的方式
May 02 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
php强大的时间转换函数strtotime
2016/02/18 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
js 多浏览器分别判断代码
2010/04/01 Javascript
JS和函数式语言的三特性
2014/03/05 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
2016/11/03 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
jquery获取img的src值实例介绍
2019/01/16 jQuery
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
Python 安装 virturalenv 虚拟环境的教程详解
2020/02/21 Python
Python Selenium截图功能实现代码
2020/04/26 Python
美国精油公司:Plant Therapy
2019/05/17 全球购物
EJB timer的种类
2014/10/28 面试题
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
应届大学生求职信
2013/12/01 职场文书
护理专业自我鉴定
2014/01/30 职场文书
六一儿童节致辞
2015/07/31 职场文书
年终工作总结范文
2019/06/20 职场文书
Django与数据库交互的实现
2021/06/03 Python