ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pytorch中的张量复制

2020-07-21 19:00:13  阅读:387  来源: 互联网

标签:梯度 clone 张量 requires Pytorch 复制 detach grad


pytorch提供了clone、detach、copy_和new_tensor等多种张量的复制操作,尤其前两者在深度学习的网络架构中经常被使用,本文旨在对比这些操作的差别。

1. clone

返回一个和源张量同shape、dtype和device的张量,与源张量不共享数据内存,但提供梯度的回溯。

clone后的返回值是个中间variable,因此支持梯度的回溯。因此,clone操作在一定程度上可以视为是一个identity-mapping函数。

clone作为一个中间variable,会将梯度传给源张量进行叠加。

但若源张量的require_grad=False,而clone后的张量require_grad=True,显然此时不存在张量回溯现象,clone后的张量可以求导。

综上论述,clone操作在不共享数据内存的同时支持梯度回溯,所以常用在神经网络中某个单元需要重复使用的场景下。

2. detach

detach的机制则与clone完全不同,即返回一个和源张量同shapedtypedevice的张量,与源张量共享数据内存,但不提供梯度计算,即requires_grad=False,因此脱离计算图。

detach后的张量,即使重新定义requires_grad=True,也与源张量的梯度没有关系。

综上论述,detach操作在共享数据内存的脱离计算图,所以常用在神经网络中仅要利用张量数值,而不需要追踪导数的场景下。

3. clone和detach联合使用

clone提供了非数据共享的梯度追溯功能,而detach又“舍弃”了梯度功能,因此clone和detach联合使用意味着着只做简单的数据复制,既不数据共享,也不对梯度共享,从此两个张量无关联

置于是先clone还是先detach,其返回值一样,一般采用tensor.clone().detach()。

4. new_tensor

new_tensor可以将源张量中的数据复制到目标张量(数据不共享),同时提供了更细致的devicedtyperequires_grad属性控制:

其默认参数下的操作等同于.clone().detach(),而requires_grad=True时的效果相当于.clone().detach()requires_grad_(True)。上面两种情况都推荐使用后者。

5. copy_

copy_同样将源张量中的数据复制到目标张量(数据不共享),其devicedtyperequires_grad一般都保留目标张量的设定,仅仅进行数据复制,同时其支持broadcast操作。

 

具体试验参考:

【Pytorch】对比clone、detach以及copy_等张量复制操作

Pytorch张量(Tensor)复制

 

标签:梯度,clone,张量,requires,Pytorch,复制,detach,grad
来源: https://www.cnblogs.com/jiangkejie/p/13356863.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有