torch中的inplace操作问题解决方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
torch中的inplace操作问题解决方法
- 一、inplace操作是什么?
- 典型的inplace操作有哪些?
- 二、出错案例
- 总结
- 例子1:a=a[:,1:,:,:]
- 例子2:a=a.permute(0,3,1,2)
- 例子3:a[:,1:,:,:]=函数1(a[:,1:,:,:])
- 例子4:b[:,1:,:,:]=函数1(a[:,1:,:,:])
一、inplace操作是什么?
可以参考:PyTorch中的In-place操作是什么?为什么要避免使用这种操作?
简单来说,就是你写的代码采用了一种更为高效的内存使用方法,有点像copy(),deepcopy(),切片等操作的关系,如果你不小心使用了inplace操作的话,则在torch的计算梯度autograd()或者反传backward()位置处出现以下提示:
Runtime Error: Found an in-place operation that changes one the variables needed by gradient computation
典型的inplace操作有哪些?
1.+=,*=等操作
例如:
a[:,0,:,:]+=b[:,0,:,:]
2.不合适的原地切片并赋值
例如:
a[:,0,:,:]=do_sth(a[:,0,:,:])#do_sth是一个函数
这也是我这次出错的原因
这也是我这次出错的原因
二、出错案例
代码如下(示例):
def forward(self, x):x_ = torch.zeros(self.layer(x[..., 0]).shape + (steps,), device=x.device)for step in range(steps):x_[..., step] = self.layer(x[..., step])if self.bn is not None:for i in range(steps):x_[:,:,:,:,i] = self.bn(x_[:,:,:,:,i])return x_
正确的代码如下:
def forward(self, x):x_ = torch.zeros(self.layer(x[..., 0]).shape + (steps,), device=x.device)for step in range(steps):x_[..., step] = self.layer(x[..., step])x_2 = torch.zeros(self.layer(x[..., 0]).shape + (steps,), device=x.device)if self.bn is not None:for i in range(steps):x_2[:,:,:,:,i] = self.bn(x_[:,:,:,:,i])return x_2 if self.bn is not None else x_
对比两段代码可以发现,正确的代码重新生成了一个tensor x_2,并进行切片赋值,而错误的代码是在原地进行的赋值修改,是torch里面的一种典型inplace操作。
总结
在查看其他博客的时候,看到一个有意思的总结,torch的inplace操作判断只要看切片的[]在哪里,如果只出现在等号的右边,那么一定不是inplace操作,如果等号的左边出现了切片[],那么就需要思考了。
再举两个例子吧
例子1:a=a[:,1:,:,:]
不是in-place.
例子2:a=a.permute(0,3,1,2)
不是in-place.
例子3:a[:,1:,:,:]=函数1(a[:,1:,:,:])
是in-place.
例子4:b[:,1:,:,:]=函数1(a[:,1:,:,:])
不是in-place.
torch中的inplace操作问题解决方法相关推荐
- 速达服务器账套定期维护么,速达软件常见操作问题解决方法
<速达软件常见操作问题解决方法>由会员分享,可在线阅读,更多相关<速达软件常见操作问题解决方法(11页珍藏版)>请在人人文库网上搜索. 1.速达软件常见操作问题解决方法,速达软 ...
- chrome 浏览器中罗技鼠标滚轮失灵问题解决方法
chrome 浏览器中罗技鼠标滚轮失灵问题解决方法 参考文章: (1)chrome 浏览器中罗技鼠标滚轮失灵问题解决方法 (2)https://www.cnblogs.com/fanyfan/p/11 ...
- linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法
Oralce安装教程 1.先安装需要的依赖包 找到哪个没有安装,直接yum install XX,直到所有的都安装完成.注意,可能一个包安装了,再次执行检查,还是提示没有安装,那么就不需要管他们了, ...
- linux+gpio+嵌入式,嵌入式Linux系统中对GPIO操作的方法总结
在Linux系统里操作GPIO的方法有以下几个: 1. 写驱动的方式 需要自己编写linux驱动,在驱动里操控GPIO,应用通过驱动提供的节点来控制GPIO.优点是结构清晰,可扩展性强,比较灵活.缺点 ...
- win7中VS2010中安装CSS3.0问题解决方法
在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网下载 CSS 3 Intellisense Schema ...
- html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法
本文和大家重点讨论一下Firefox嵌套CSS中div标签的居中问题的解决方法,主要包括使用line-height垂直居中,清除容器浮动,不让链接折行,始终让Firefox显示滚动条等内容. Fire ...
- php时区问题,PHP中遇到的时区问题解决方法
最近在学习PHP过程中发现PHP中的格式化时间戳比北京时间晚了8个小时,上网搜索发现原来是时区不对,解决办法是: 1.永久修改 更改php.ini文件中的data.timezone = PRC 这是 ...
- oracle分页排序查询,Oracle分页查询中排序与效率问题解决方法详解
本文将结合作者近日工作中,在ORACLE数据库分页查询时,遇到一个小问题,为大家讲解如何解决Oracle分页查询中排序与效率问题. 原始未分页查询Sql代码如下: select ROWNUM rn, ...
- java谷歌填表_chrome自动填表会遮挡input中背景图的问题解决方法
在做某项目登录界面时,发现用户密码框在Chrome自动填充时,input中的背景框会被遮住.网上也搜了一下,没有一个有效的解决方法. 来看csdn的登录界面,也有这个问题. 后来在浏览网页时,无意中发 ...
最新文章
- php中this,self,parent三个关键字
- STM32 电机教程 20 - 基于ST MC Workbench 无感FOC
- ALS爱立思脚本调用参考
- 数据中心管理:从DCIM过渡到DMAAS
- 使用Javascript来实现的超炫组织结构图(Organization Chart)
- python面试题汇总(1)
- ModuleNotFoundError: No module named ‘torch.utils.serialization‘解决
- 电商美工忙不停,年货节海报素材模板,拯救电商汪
- hihocoder 1513 小Hi的烦恼——bitset
- 事件冒泡、事件捕获、事件委托
- Android Alertdialog之多选对话框
- 走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」- 第449篇
- 批量将txt文件转为csv文件
- 基于百度短语音API的语音识别实现
- 金蝶标准版7.0计算机快捷,掌握金蝶KIS基本的技巧,快速操作金蝶软件!
- ode45 matlab 出错,Matlab中ode45求解出错
- 4.ADS操作入门_Circuit Envelope Simulation with Modulated Sources
- Android凉了也要看的面试题,2020年5月美团Android面试真题(三面
- 两性离子洗涤剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 因果推断—现代统计的思想飞跃:过去、现在到未来(伯克利丁鹏博士万字长文)...
热门文章
- QT之TreeView
- 怎么更改计算机用户名网络密码怎么办,怎么改wifi密码和名称(电脑修改wifi密码步骤)...
- SNIPER: Efficient Multi-Scale Training解读
- java编程电话号码查询_java课程设计电话号码查询系统(15页)-原创力文档
- 掌阅标签功能能否自定义名字?
- 2021_lg_03.SQL实战:如何用sql计算用户留存问题
- Performance Counter的使用
- Ceph RBD:条带(stripe)详解
- context.getContentResolver().query()详细用法详解
- jQuery过滤器:筛选jquery对象数组中的DOM对象