当前位置: 首页 > news >正文

【深度学习基础】PyTorch Tensor生成方式及复制方法详解

目录

  • PyTorch Tensor生成方式及复制方法详解
    • 一、Tensor的生成方式
      • (一)从Python列表/元组创建
      • (二)从NumPy数组创建
      • (三)特殊初始化方法
      • (四)从现有Tensor创建
    • (五)高级初始化方法
    • 二、复制方法对比
      • (一) `torch.tensor()` vs `torch.from_numpy()`
      • (二) `.clone()` vs `.copy_()` vs `copy.deepcopy()`
      • (三) 深度拷贝(Deep Copy)
    • 三、核心区别总结
    • 四、最佳实践建议

PyTorch Tensor生成方式及复制方法详解

在PyTorch中,Tensor的创建和复制是深度学习开发的基础操作。本文将全面总结Tensor的各种生成方式,并深入分析不同复制方法的区别。


一、Tensor的生成方式

(一)从Python列表/元组创建

import torch# 直接创建Tensor
t1 = torch.tensor([1, 2, 3])          # 整型Tensor
t2 = torch.tensor([[1.0, 2], [3, 4]])  # 浮点型Tensor

(二)从NumPy数组创建

import numpy as nparr = np.array([1, 2, 3])
t = torch.from_numpy(arr)  # 共享内存

(三)特殊初始化方法

zeros = torch.zeros(2, 3)      # 全0矩阵
ones = torch.ones(2, 3)       # 全1矩阵
rand = torch.rand(2, 3)        # [0,1)均匀分布
randn = torch.randn(2, 3)      # 标准正态分布
arange = torch.arange(0, 10, 2) # 0-10步长为2

(四)从现有Tensor创建

x = torch.tensor([1, 2, 3])
x1 = x.new_tensor([4, 5, 6])  # 新Tensor(复制数据)
x2 = torch.zeros_like(x)       # 形状相同,全0
x3 = torch.randn_like(x)       # 形状相同,随机值

(五)高级初始化方法

eye = torch.eye(3)             # 3x3单位矩阵
lin = torch.linspace(0, 1, 5)  # 0-1等分5份
log = torch.logspace(0, 2, 3)  # 10^0到10^2等分3份

二、复制方法对比

(一) torch.tensor() vs torch.from_numpy()

方法数据源内存共享梯度传递数据类型
torch.tensor()Python数据不共享支持自动推断
torch.from_numpy()NumPy数组共享不支持保持一致
# 示例:内存共享验证
arr = np.array([1, 2, 3])
t = torch.from_numpy(arr)
arr[0] = 99  # 修改NumPy数组
print(t)      # tensor([99, 2, 3]),同步变化

(二) .clone() vs .copy_() vs copy.deepcopy()

方法内存共享梯度传递计算图保留使用场景
.clone()不共享保留梯度保留计算图需要梯度回传
.copy_()目标共享不保留破坏计算图高效覆盖数据
copy.deepcopy()不共享不保留不保留完全独立拷贝
# 示例:梯度传递对比
x = torch.tensor([1.], requires_grad=True)
y = x.clone()
z = torch.tensor([2.], requires_grad=True)
z.copy_(x)  # 覆盖z的值y.backward()  # 正常回传梯度到x
# z.backward() # 报错!copy_()破坏计算图

(三) 深度拷贝(Deep Copy)

import copyorig = torch.tensor([1, 2, 3])
deep_copied = copy.deepcopy(orig)  # 完全独立拷贝

三、核心区别总结

  1. 内存共享

    • from_numpy() 与NumPy共享内存
    • 视图操作(如view()/切片)共享内存
    • 其他方法均创建独立副本
  2. 梯度处理

    • .clone() 唯一保留梯度计算图
    • copy_() 会破坏目标Tensor的计算图
    • torch.tensor() 创建新计算图
  3. 使用场景

    • 需要梯度回传:使用.clone()
    • 高效数据覆盖:使用.copy_()
    • 完全独立拷贝:使用copy.deepcopy()
    • 与NumPy交互:使用from_numpy()/numpy()

四、最佳实践建议

  1. 优先使用torch.tensor()创建新Tensor
  2. 需要从NumPy导入数据且避免复制时用from_numpy()
  3. 在计算图中复制数据时必须使用.clone()
  4. 需要覆盖现有Tensor数据时使用.copy_()
  5. 调试时注意内存共享可能导致的意外修改
# 正确梯度传递示例
x = torch.tensor([1.], requires_grad=True)
y = x.clone() ** 2  # 保留计算图
y.backward()        # 梯度可回传到x
http://www.dtcms.com/a/338087.html

相关文章:

  • 【每日一题】Day 7
  • Linux——进程间、线程间的通信
  • 【C++】 using声明 与 using指示
  • 《彩色终端》诗解——ANSI 艺术解码(DeepSeek)
  • C++设计模式:建造者模式
  • 《若依》权限控制
  • ESP32小智-语音活动(VAD)检测流程
  • Pytorch GPU版本安装保姆级教程
  • 【Python面试题】描述一次解决内存泄漏的过程。如何用tracemalloc或者objgraph定位问题?什么情况下会用__slots__?
  • 【领码课堂】AI写码不再“盲跑”,方案先行,自动化高效落地
  • BOSS直聘招聘端AI辅助自动化技术研究
  • 某储备土地前期开发项目控制保护区桥梁自动化监测
  • 8.19 note
  • HashMap:源码
  • OpenLayers 入门指南【七】:加载自定义控件
  • 部署耐达讯自动化Profibus转光纤方案,变频器通信从此告别‘掉线焦虑’!“
  • Next.js数据获取
  • 飞算JavaAI智慧文旅场景实践:从景区管理到游客服务的全链路系统搭建
  • 无人机激光测距技术应用与挑战
  • 【前端进阶】UI渲染优化 - 骨架屏技术详解与多框架实现方案
  • Maven(一)
  • 做一个答题pk小程序多少钱?
  • 《红色脉-络:一部PLMN在中国的演进史诗 (1G-6G)》 第6篇 | 专题:核心网的第一次革命——从电路交换到“用户/控制面分离”
  • java17学习笔记-增强型伪随机数生成器
  • LeetCode100-438找到字符串中所有的字母异位词
  • 上网行为管理之用户认证技术和应用控制技术
  • 开源im即时通讯软件开发社交系统全解析:安全可控、功能全面的社交解决方案
  • 具身智能3全身动力学控制软件包(人形机器人)摘自Openloong社区
  • N32G430C8-串口驱动问题
  • MATLAB的实用字母识别系统实现含GUI界面