tensor复制可以使用clone()函数和detach()函数即可实现各种需求。

clone

clone()函数可以返回一个完全相同的tensor,新的tensor开辟新的内存,但是仍然留在计算图中。

detach

detach()函数可以返回一个完全相同的tensor,新的tensor开辟与旧的tensor共享内存,新的tensor会脱离计算图,不会牵扯梯度计算。此外,一些原地操作(in-place, such as resize_ / resize_as_ / set_ / transpose_) 在两者任意一个执行都会引发错误。

使用分析

# Operation New/Shared memory Still in computation graph
tensor.clone() New Yes
tensor.detach() Shared No
tensor.clone().detach() New No

如下执行一些实例:
首先导入包并固定随机种子

import torch
torch.manual_seed(0)

1.clone()之后的tensor requires_grad=True,detach()之后的tensor requires_grad=False,但是梯度并不会流向clone()之后的tensor

x= torch.tensor([1., 2., 3.], requires_grad=True)
clone_x = x.clone()
detach_x = x.detach()
clone_detach_x = x.clone().detach()f = torch.nn.Linear(3, 1)
y = f(x)
y.backward()print(x.grad)
print(clone_x.requires_grad)
print(clone_x.grad)
print(detach_x.requires_grad)
print(clone_detach_x.requires_grad)

输出:

tensor([-0.0043,  0.3097, -0.4752])
True
None
False
False

2.将计算图中参与运算tensor变为clone()后的tensor。此时梯度仍然只流向了原始的tensor。

x= torch.tensor([1., 2., 3.], requires_grad=True)
clone_x = x.clone()
detach_x = x.detach()
clone_detach_x = x.detach().clone()f = torch.nn.Linear(3, 1)
y = f(clone_x)
y.backward()print(x.grad)
print(clone_x.grad)
print(detach_x.requires_grad)
print(clone_detach_x.requires_grad)

输出:

tensor([-0.0043,  0.3097, -0.4752])
None
False
False

3.将原始tensor设为requires_grad=False,clone()后的梯度设为.requires_grad_(),clone()后的tensor参与计算图的运算,则梯度穿向clone()后的tensor。

x= torch.tensor([1., 2., 3.], requires_grad=False)
clone_x = x.clone().requires_grad_()
detach_x = x.detach()
clone_detach_x = x.detach().clone()f = torch.nn.Linear(3, 1)
y = f(clone_x)
y.backward()print(x.grad)
print(clone_x.grad)
print(detach_x.requires_grad)
print(clone_detach_x.requires_grad)

输出:

None
tensor([-0.0043,  0.3097, -0.4752])
False
False

4.detach()后的tensor由于与原始tensor共享内存,所以原始tensor在计算图中数值反向传播更新之后,detach()的tensor值也发生了改变。

x = torch.tensor([1., 2., 3.], requires_grad=True)
f = torch.nn.Linear(3, 1)
w = f.weight.detach()
print(f.weight)
print(w)y = f(x)
y.backward()optimizer = torch.optim.SGD(f.parameters(), 0.1)
optimizer.step()print(f.weight)
print(w)

输出:

Parameter containing:
tensor([[-0.0043,  0.3097, -0.4752]], requires_grad=True)
tensor([[-0.0043,  0.3097, -0.4752]])
Parameter containing:
tensor([[-0.1043,  0.1097, -0.7752]], requires_grad=True)
tensor([[-0.1043,  0.1097, -0.7752]])

Pytorch张量(Tensor)复制相关推荐

  1. Pytorch张量tensor的使用

    1. 张量Tensor Tensors张量: 张量的概念类似于Numpy中的ndarray数据结构, 最大的区别在于Tensor可以利用GPU的加速功能. 张量是一个统称,其中包含很多类型:   [各 ...

  2. pytorch 张量tensor 转为 jpg 图片

    在用pytorch训练网络的时候,每一张图片都被转为了张量形式的数据,有时候我们需要将这些张量转为jpg格式的图片,应该如何转变呢?我们只要将张量tensor转为PIL格式的数据,然后再将数据保存起来 ...

  3. pytorch张量(tensor)常用高级操作函数

    张量创建 张量拼接.切分.索引和变换 torch.cat(),torch.concentrate(),torch.concat() 注:这三个函数是等价的 函数:torch.cat(tensors, ...

  4. 笔记 | PyTorch张量Tensor的一些必备操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 张量是什么? 标量:0维张量:比如一个单独的数字1 向量:1维张量 ...

  5. Pytorch 张量tensor

    文章目录 1. tensor 张量 2. 运算 3. 切片.形状size().改变形状view() 4. item() 只能读取一个元素 参考 http://pytorch123.com/ 1. te ...

  6. PyTorch的Tensor(张量)

    Tensor的概念 Tensor(张量)是一个多维数组,它是标量.向量.矩阵的高维拓展. 标量是一个零维张量,是没有方向的,是一个数.一维张量只有一个维度,是一行或者一列.二维张量是一个矩阵,有两个维 ...

  7. pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换

    pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换 1, 创建pytorch 的Tensor张量: torch.rand((3,224,224)) #创建随机值的三维张量,大小为 ...

  8. pytorch 创建张量tensor

    pytorch 创建张量tensor 先看下面一张图 通过上图有了一个直观了解后,我们开始尝试创建一下. 先创建一个标量和一个向量 a = torch.tensor([1]) #标量 print(a) ...

  9. 深度学习框架pytorch入门之张量Tensor(一)

    文章目录 一.简介 二.查看帮助文档 三.Tensor常用方法 1.概述 2.新建方法 (1)Tensor(*sizes) tensor基础构造函数 (2)ones(*sizes) 构造一个全为1的T ...

最新文章

  1. ubuntu16.04安装英伟达(NVIDIA)驱动——run文件安装
  2. Java解码vhd的磁盘文件,VHD Java library
  3. ACM入门之【分块习题】
  4. Android中怎样在项目中引入别的项目中正使用的library
  5. boost::mp11::mp_second相关用法的测试程序
  6. s5-2 Cpu调度算法
  7. JSON格式数据与数据组件
  8. Dubbo Mesh | 阿里巴巴中间件团队在 Service Mesh 的实践和探索(附PPT)
  9. 成功运行官方Tensorflow Android的demo的过程
  10. 汉化:Blocs for Mac(可视化网页设计工具)4.5.0
  11. c语言小车程序,循迹小车程序C语言
  12. office计算机高级应用,全国高等学校计算机水平考试Ⅱ级《Office2010高级应用》考试大纲(试行)...
  13. 74LS138-三人表决电路
  14. 海康云台摄像机 ISAPI 的签名机制与语音传输
  15. QQ安装时注册组件不动的解决方法
  16. 使用DiskGenius找回VMware损坏虚拟机里的文件
  17. 什么是SPA(单页面应用)?
  18. idae怎么修改背景图片
  19. expected `;' before ‘iter’
  20. php curl调用第三方接口小样

热门文章

  1. 总结下利用python赚钱的方法,在闲余时间月赚2k-5k
  2. IC Compiler II(ICC II)后端设计流程——超详细
  3. Git让你从入门到精通,看这一篇就够了!
  4. 【统计学笔记】各种假设检验的假设的建立和各统计量公式总结
  5. 720P、1080P、1440P、2160P、HD、FHD、UHD、2K屏、4K屏是什么意思
  6. 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
  7. Navicat连接腾讯云服务器的MySQL
  8. 一站放心购全球:亚马逊海外购开启2022年黑五全球购物季
  9. sprintf函数详细解释
  10. 重装系统以后找不到机械硬盘