Pytorch-contiguous()

在看代码的时候看到了contiguous的用法,特在此总结。

我的理解上这个的作用有点像deepcopy,如果有理解不对的地方,欢迎指出。

未使用contiguous.png

从图中我们可以看到对矩阵m进行转置之后,其实d指向的还是m。当我们修改了d中的数据之后,m中的数据也随之变化了,这其实和我们的本意是相违背的。

按照之前找的资料里面说d里面数据布局的方式和从头开始创建一个常规的tensor布局的方式是不一样的。听起来有些拗口。

我的理解就是这个可能只是python中之前常用的浅拷贝,d还是指向m变量所处的位置,只是说记录了transpose这个变化的布局。

在这里,如果想要拜托这两个变量之间的依赖(m本身是contiguous的),就要使用contiguous针对m进行变化,感觉上就是我们认为的深拷贝。

使用了contiguous.png

从上图 ,我们可以看到我们对d进行改变之后,和m没有关系了。(也就是我们理解的经过深拷贝了,和原来无关了)

在这里,要提醒大家一个我踩了的坑。一开始我被contiguous的字面意思“连续的”所误导了,以为在内存中不是存在一块连续的地址,其实tensor中的数据还是存在内存中的一块区域里,只是布局问题。、

所以当调用contiguous后,就会创建一个独立的布局和原来的那个变量独立开来。

在我们写代码的时候其实不用太担心,如果在需要调用contiguous的地方没有调用contiguous,系统会报错,到时候加上就好了。

参考资料:https://blog.csdn.net/gdymind/article/details/82662502

你可能感兴趣的:(Pytorch-contiguous())