pytorch中深度拷贝_pytorch:对比clone、detach以及copy_等张量复制操作

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

1. clone

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

下面,通过例子来详细说明:

示例:

(1)定义

import torch

a = torch.tensor(1.0, requires_grad=True, device="cuda", dtype=torch.float64)

a_ = a.clone()

print(a_) # tensor(1., device='cuda:0', dtype=torch.float64, grad_fn=)

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

(2)梯度的回溯

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

import torch

a = torch.tensor(1.0, requires_grad=True)

y = a ** 2

a_ = a.clone()

z = a_ * 3

y.backward()

print(a.grad) # 2

z.backward()

print(a_.grad)   # None. 中间variable,无grad

print(a.grad) # 5. a_的梯度会传递回给a,因此2+3=5

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

import torch

a = torch.tensor(1.0)

a_ = a.clone()

a_.requires_grad_()

y = a_ ** 2

y.backward()

print(a.grad) # None

print(a_.grad) # 2. 可得到导数

(3)张量数据非共享

import torch

a = torch.tensor(1.0, requires_grad=True)

a_ = a.clone()

a.data *= 3

a_ += 1

print(a) # tensor(3., requires_grad=True)

print(a_) # tensor(2., grad_fn=). 注意grad_fn的变化

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

2. detach

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

同样,通过例子来详细说明:

(1)定义

import torch

a = torch.tensor(1.0, requires_grad=True, device="cuda", dtype=torch.float64)

a_ = a.detach()

print(a_) # tensor(1., device='cuda:0', dtype=torch.float64)

(2)脱离原计算图

import torch

a = torch.tensor(1.0, requires_grad=True)

y = a ** 2

a_ = a.detach()

print(a_.grad) # None,requires_grad=False

a_.requires_grad_() # 强制其requires_grad=True,从而支持求导

z = a_ * 3

y.backward()

z.backward()

print(a.grad) # 2,与a_无关系

print(a_.grad) #

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

(3)共享张量数据内存

import torch

a = torch.tensor(1.0, requires_grad=True)

a_ = a.detach()

print(a) # tensor(1., requires_grad=True)

print(a_) # tensor(1.)

a_ += 1

print(a) # tensor(2., requires_grad=True)

print(a_) # tensor(2.)

a.data *= 2

print(a) # tensor(4., requires_grad=True)

print(a_) # tensor(4.)

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

3. clone和detach联合使用

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

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

4. new_tensor

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

new_tensor(data, dtype=None, device=None, requires_grad=False)

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

5. copy_

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

a = torch.tensor([[1,2,3], [4,5,6]], device="cuda")

b = torch.tensor([7.0,8.0,9.0], requires_grad=True)

a.copy_(b)

print(a) # tensor([[7, 8, 9], [7, 8, 9]], device='cuda:0')

【Ref】:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php显示doc文件乱码,如何解决php doc 乱码问题

PHP下载DOC乱码最近做的一个系统,需要下载doc文件以前的代码下载完成后,打开总是乱码...google咯很久也没有解决办法后面总算搞定必须在Header之前进行清除,即 ob_end_clean()$file_size filesize($logName);ob_end_clean();header("Content-type:application/octet-stre…

c++ 多重背包状态转移方程_Python|动态规划关于0-1背包问题

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理以下文章来源于腾讯云,作者:算法与编程之美前言对学算法的同学来说,动态规划是其必学且较为重要的问题之一;…

golang string转int8_golang 中string和int类型相互转换

Notepad++ 默认快捷键Notepad绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad默认的快捷键做个整理(其中有颜色的为常用招数): 1 ...DB2执行脚本经常会遇到数据库脚本放在.sql文件中,那么怎么去执…

java 第二天,Java复习第二天

1.idea里jar包和war的区别JAR(JAVA Archive 是类的归档文件),JAR 文件不仅用于压缩和发布,而且还用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。简单来说,jar包就像一个插件而且是打包已经写好的类…

qlistview 自定义控件_是否可以在QListView中添加自定义窗口小部件?

I have a large log data (100, 1000, 100000, ... records) and I want to visualize it in the following manner:Which widget (e.g. QListView, QListWidget) should I use and how, in order to stay away from performance and memory problems?解决方案Is it possible …

php 零宽断言,正则表达式之零宽断言实例详解

这篇文章主要介绍了正则表达式之零宽断言,简单介绍了零宽断言的概念、分类及php实现技巧与相关注意事项,需要的朋友可以参考下本文实例讲述了正则表达式之零宽断言。分享给大家供大家参考,具体如下:前言之前我曾写了一篇关于正则表达式的文章(http://www…

element ui 多个子组件_vue前端UI框架,一点都不圆润,盘它!

面对众多vue前端UI框架,看着它们干干巴巴、麻麻赖赖的样子,一点都不圆润,跟我一起盘它!Vue移动端UI框架1、Vux(star:15620)VUX(读音 [v’ju:z],同 views)是基于WeUI和Vue(2.x)开发的…

ios 裁剪圆形头像_iOS开发之裁剪圆形头像

- (void)viewDidLoad {[super viewDidLoad];//加载图片UIImage *image [UIImage imageNamed:"菲哥"];//获取图片尺寸CGSize size image.size;//开启位图上下文UIGraphicsBeginImageContextWithOptions(size, NO, 0);//创建圆形路径UIBezierPath *path [UIBezierPa…

python 图像处理_Python中的十大图像处理工具

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。来源 | 大数据文摘(BigDataDigest)编译 | 张秋玥、小七、蒋宝尚本文主要介绍了一些简单易懂最常用的 Python 图像处理库。当今世界充满了各种数据&am…

php函数方法,基于PHP函数的操作方法

如下所示://简单函数function show(){echo "hello";}show();//有参数的函数function show($a){echo "$a";}show("world");//有返回值的函数function show(){return "小V,你好!";}echo show();functi…

centos7安装php5.2yum源操作_Centos7.6使用yum安装PHP7.2

Centos7.6使用yum安装PHP7.21、安装源安装php72w,是需要配置额外的yum源地址的,否则会报错不能找到相关软件包。php高版本的yum源地址,有两部分,其中一部分是epel-release,另外一部分来自webtatic。如果跳过epel-relea…

mysqlclient==1.3.7对应mysql版本_「MySQL」CentOs 7 下安装MySQL

MySQLMySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一YUM 安装mysql1、下载 YUM 仓库文件打开网址: https://dev.mysql.com/downloads/…

php rewinddir(),PHP rewinddir() 函数 ——jQuery中文网

实例打开一个目录,列出其中的文件,充值目录句柄,重新列出其中的文件,然后关闭:$dir "/images/";// Open a directory, and read its contentsif(is_dir($dir)){if ($dh opendir($dir)){//List files in im…

汇编jnl_汇编指令集

1 X86和X87汇编指令大全(有注释)2 ---------- 一、数据传输指令 ----------------------------------------------------3 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.4 1. 通用数据传送指令.5 MOV 传送字或字节.6 MOVSX 先符号扩展,再传送.7 MOVZX 先零扩展,再传…

nginx log response_nginx优化配置大全

很多程序员面试被问到nginx优化做过哪些,因此来记录下配置文件样例为生产环境样例。1、nginx基本优化安装方式有2种:1、源码包安装 2、yum(apt-get)安装区别为如果用yum安装的话,很方便,并且基本不报错。如…

指纹对比软件_iQOO VS 小米9屏幕指纹大对决,这次我为vivo疯狂打Call!

在经历了性能、续航、充电的对比之后,我们今天带来了iQOO和小米9的屏幕指纹对比,看看两者在屏幕指纹方面究竟有何不同的表现。▼屏幕指纹原理目前屏幕指纹技术大致分为光电屏幕指纹和超声波屏幕指纹两种,而iQOO和小米9所采用的都是光电屏幕指…

oracle数据库恢复参数文件位置,Oracle数据库的参数文件备份与恢复

Oracle数据库的参数文件包含两个文件:一个是spfile二进制文件名字为spfilesid.ora(其中sid你数据库的实例名称)。另一个是pfile文本文件的参数文件,名字为initsid.ora(其中sid你数据库的实例名称)。默认情况下数据库是只有一个参数文件的,那就是spfile,它…

python绘制3d坐标轴_matplotlib在python上绘制3D散点图实例详解

大家可以先参考官方演示文档: 效果图:3D scatterplotDemonstration of a basic scatterplot in 3D.from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np def randrange(n, vmin, vmax):Helper function to mak…

oracle cascade是什么意思啊,Oracle外键(Foreign Key)之级联删除(DELETE CASCADE)

什么是级联删除(DELETE CASCADE)?级联删除是指当主表(parent table)中的一条记录被删除,子表中关联的记录也相应的自动删除。备注:外键字段在该表中为主键的表,即为主表;外键字段在该表中为普通字段的表,即…

翻转链表python递归_Python实现链表反转的方法【迭代法与递归法】

导读 这篇文章主要介绍了Python实现链表反转的方法,结合实例形式分析了Python迭代法与递归法实现链表反转的相关操作技巧与注意事项,需要的朋友可以参考下 本文实例讲述了Python实现链表反转的方法。分享给大家供大家参考,具体如下: Python实现链表反转 …