栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Pytorch 中关于in-place operation的小总结

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Pytorch 中关于in-place operation的小总结

问题引入

有些时候,我们需要对Tensor中的某些部分进行一些重新赋值的操作(即in-place operation),但是如果该步骤涉及到一些需要计算梯度的叶子变量 (即requires_grad=True)时,Pytorch会报如下错误:a leaf Variable that requires grad has been used in an in-place operation, 原因是这种in-place operation是一种原位操作,是无法计算梯度的。比如下面这个简单的例子。

import torch
import torch.nn as nn

创建一个简单的 1d batch normalization layer

bn=nn.BatchNorm1d(10) # 10维的特征

创建一个简单的leaf tensor,同时要求计算梯度

a=torch.tensor(0.5, requires_grad=True)

检验是否为leaf

a.is_leaf
# 返回 True

进行in-place operation, 我希望将batch normalization层的权重参数设置为a.

bn.weight.fill_(a)
# 报错
# RuntimeError: a leaf Variable that requires grad is being used in an in-place operation.
解决方案

一个非常简单的方案就是,将这个 in-place operation放置在torch.no_grad()下面,这样的话,这一步骤不会参与梯度传播,自然也就不会报错。

with torch.no_grad():
	bn.weight.fill_(a)

我们来看一下赋值后的weight,没有出现问题。

Parameter containing:
tensor([0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000, 0.5000,
        0.5000], requires_grad=True)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/503955.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号