pytorch in-place 引用 深拷贝的坑

2023-05-16

一、引用、拷贝

  • pytorch引用和深拷贝

(1)原来 Torch 中为了提高速度,model:forward() 操作之后赋予的变量是不给这个变量开盘新的存储空间的,而是 引用。就相当于 起了个别名。

不光这里,torch里面向量或是矩阵的赋值是指向同一内存的,这种策略不同于 Matlab。如果想不想引用,可以用 clone() 进行 深拷贝

(2)getParameters()

This function will go over all the weights and gradWeights and make them view into a single tensor (one for weights and one for gradWeights). Since the storage of every weight and gradWeight is changed, this function should be called only once on a given network.

参考:https://blog.csdn.net/u010167269/article/details/52073136

  • python的赋值

在 python 中赋值语句总是建立对象的引用值,而不是复制对象。因此,python 变量更像是指针,而不是数据存储区域,

Python 没有「变量」,我们平时所说的变量其实只是「标签」,是引用

参考:https://draapho.github.io/2016/11/21/1618-python-variable/

  • 深拷贝和浅拷贝

Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。

1、copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。

2、copy.deepcopy 深拷贝 拷贝对象及其子对象

参考:https://blog.csdn.net/NockinOnHeavensDoor/article/details/80645490

二、in-place

in-place operation在pytorch中是指改变一个tensor的值的时候,不经过复制操作,而是直接在原来的内存上改变它的值。可以把它成为原地操作符。

在pytorch中经常加后缀“_”来代表原地in-place operation,比如说.add_() 或者.scatter()。python里面的+=,*=也是in-place operation。

在 pytorch 中, 有两种情况不能使用 inplace operation:

1. 对于 requires_grad=True 的 叶子张量(leaf tensor) 不能使用 inplace operation

2. 对于在 求梯度阶段需要用到的张量 不能使用 inplace operation

ps:如果你使用了in-place operation而没有报错的话,那么你可以确定你的梯度计算是正确的。

参考:[1] https://blog.csdn.net/york1996/article/details/81835873

[2] https://zhuanlan.zhihu.com/p/38475183

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch in-place 引用 深拷贝的坑 的相关文章

随机推荐