提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

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操作问题解决方法相关推荐

  1. 速达服务器账套定期维护么,速达软件常见操作问题解决方法

    <速达软件常见操作问题解决方法>由会员分享,可在线阅读,更多相关<速达软件常见操作问题解决方法(11页珍藏版)>请在人人文库网上搜索. 1.速达软件常见操作问题解决方法,速达软 ...

  2. chrome 浏览器中罗技鼠标滚轮失灵问题解决方法

    chrome 浏览器中罗技鼠标滚轮失灵问题解决方法 参考文章: (1)chrome 浏览器中罗技鼠标滚轮失灵问题解决方法 (2)https://www.cnblogs.com/fanyfan/p/11 ...

  3. linux 环境下安装oracle11g方法及安装过程中遇上的问题解决方法

     Oralce安装教程 1.先安装需要的依赖包 找到哪个没有安装,直接yum install XX,直到所有的都安装完成.注意,可能一个包安装了,再次执行检查,还是提示没有安装,那么就不需要管他们了, ...

  4. linux+gpio+嵌入式,嵌入式Linux系统中对GPIO操作的方法总结

    在Linux系统里操作GPIO的方法有以下几个: 1. 写驱动的方式 需要自己编写linux驱动,在驱动里操控GPIO,应用通过驱动提供的节点来控制GPIO.优点是结构清晰,可扩展性强,比较灵活.缺点 ...

  5. win7中VS2010中安装CSS3.0问题解决方法

    在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网下载 CSS 3 Intellisense Schema ...

  6. html中div不在火狐居中,Firefox嵌套CSS中div标签居中问题解决方法

    本文和大家重点讨论一下Firefox嵌套CSS中div标签的居中问题的解决方法,主要包括使用line-height垂直居中,清除容器浮动,不让链接折行,始终让Firefox显示滚动条等内容. Fire ...

  7. php时区问题,PHP中遇到的时区问题解决方法

    最近在学习PHP过程中发现PHP中的格式化时间戳比北京时间晚了8个小时,上网搜索发现原来是时区不对,解决办法是: 1.永久修改 更改php.ini文件中的data.timezone = PRC  这是 ...

  8. oracle分页排序查询,Oracle分页查询中排序与效率问题解决方法详解

    本文将结合作者近日工作中,在ORACLE数据库分页查询时,遇到一个小问题,为大家讲解如何解决Oracle分页查询中排序与效率问题. 原始未分页查询Sql代码如下: select ROWNUM rn, ...

  9. java谷歌填表_chrome自动填表会遮挡input中背景图的问题解决方法

    在做某项目登录界面时,发现用户密码框在Chrome自动填充时,input中的背景框会被遮住.网上也搜了一下,没有一个有效的解决方法. 来看csdn的登录界面,也有这个问题. 后来在浏览网页时,无意中发 ...

最新文章

  1. php中this,self,parent三个关键字
  2. STM32 电机教程 20 - 基于ST MC Workbench 无感FOC
  3. ALS爱立思脚本调用参考
  4. 数据中心管理:从DCIM过渡到DMAAS
  5. 使用Javascript来实现的超炫组织结构图(Organization Chart)
  6. python面试题汇总(1)
  7. ModuleNotFoundError: No module named ‘torch.utils.serialization‘解决
  8. 电商美工忙不停,年货节海报素材模板,拯救电商汪
  9. hihocoder 1513 小Hi的烦恼——bitset
  10. 事件冒泡、事件捕获、事件委托
  11. Android Alertdialog之多选对话框
  12. 走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」- 第449篇
  13. 批量将txt文件转为csv文件
  14. 基于百度短语音API的语音识别实现
  15. 金蝶标准版7.0计算机快捷,掌握金蝶KIS基本的技巧,快速操作金蝶软件!
  16. ode45 matlab 出错,Matlab中ode45求解出错
  17. 4.ADS操作入门_Circuit Envelope Simulation with Modulated Sources
  18. Android凉了也要看的面试题,2020年5月美团Android面试真题(三面
  19. 两性离子洗涤剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. 因果推断—现代统计的思想飞跃:过去、现在到未来(伯克利丁鹏博士万字长文)...

热门文章

  1. QT之TreeView
  2. 怎么更改计算机用户名网络密码怎么办,怎么改wifi密码和名称(电脑修改wifi密码步骤)...
  3. SNIPER: Efficient Multi-Scale Training解读
  4. java编程电话号码查询_java课程设计电话号码查询系统(15页)-原创力文档
  5. 掌阅标签功能能否自定义名字?
  6. 2021_lg_03.SQL实战:如何用sql计算用户留存问题
  7. Performance Counter的使用
  8. Ceph RBD:条带(stripe)详解
  9. context.getContentResolver().query()详细用法详解
  10. jQuery过滤器:筛选jquery对象数组中的DOM对象