pytorch张量创建、张量复制

pytorch张量创建、张量复制

首先注意一点:在torch中,可导张量计算出的新张量也是可导的,新张量与原张量具有可导连接,那么原张量就不是叶子张量,新张量成了叶子张量。

创建方式一:torch.tensor()

torch.tensor(data , *, dtype=None , device=None , requires_grad=False , pin_memory=False ) → Tensor

torch.tensor只能从指定的数据创建,但是可以指定数据属性,是否可微分等属性。pin_memory是将张量放置到锁业内存中,所以这个张量只能被cpu使用。

python 复制代码
import torch
a = [1, 2, 3]
b = torch.tensor(a, requires_grad=True, dtype=torch.float64)
创建方式二:torch.Tensor

按照形状创建,如果输入列表,就按照指定数据创建。

整数:torch.ShortTensor 16位,torch.IntTensor 32位,torch.LongTensor 64位

浮点:torch.FloatTensor=torch.Tensor 32位,torch.DoubleTensor 64位

注意:torch.Tensor(int1, int2,int3)会创建[int1, int2,int3]形状的张量,如果传入列表元组等,就会返回该列表元组张量。

python 复制代码
import torch
torch.Tensor(3) 
'''tensor([-2.6853e+05,  1.9983e-42,  2.3694e-38])'''
torch.Tensor(3, 1) 
'''
tensor([[3.2842e-15],
        [3.1714e+00],
        [2.3694e-38]])
'''
torch.Tensor([3, 1])
'''
tensor([3., 1.])
'''
同设备内复制 - tensor.data /tensor.detach()/tensor.clone的区别

这三个单独会用都会和原张量有牵扯:

  1. tensor.data和tensor.detach():随着原张量的数值变化而变化。剥离开了原张量的微分图。
  2. tensor.clone() : 还处于原张量的微分图中。复制了原张量的数值。也就是tesnor.clone().bachward()后,原张量的微分图会进行一次反向传导。
  3. 完全没牵扯:tensor.clone().detach()

举例:

python 复制代码
import torch

a = torch.tensor(1, requires_grad=True, dtype=torch.float32)
b = a * 2

b_data = b.data
b_detach = b.detach()
b_clone = b.clone()
print(b, b_data, b_detach, b_clone)
'''
tensor(2., grad_fn=<MulBackward0>) tensor(2.) tensor(2.) tensor(2., grad_fn=<CloneBackward0>)
'''
# 当其中一个改变时,tensor.data, tensor.detach也会改变。tensor.clone不会改变。
b_detach.zero_()
print(b, b_data, b_detach, b_clone)
'''
tensor(0., grad_fn=<MulBackward0>) tensor(0.) tensor(0.) tensor(2., grad_fn=<CloneBackward0>)
'''

当tensor.detach或者tensor.data改变数值时,并不会影响原张量的微分传导结果。

python 复制代码
import torch

a = torch.tensor(1, requires_grad=True, dtype=torch.float32)
b = a * 2

b_data = b.data
b_detach = b.detach()
b_clone = b.clone()

# a的微分结果不受影响
b_detach.zero_()
b.backward(retain_graph=True)
print(a.grad)

# 如果原张量本身变化,则会受到影响。
b.zero_()
a.grad.zero_()
b.backward()
print(a.grad)
'''
tensor(2.)
tensor(0.)
'''

tensor.clone会保持原张量的微分传导图,并会叠加到结果上。

python 复制代码
import torch

a = torch.tensor(1, requires_grad=True, dtype=torch.float32)
b = a * 2

b_clone = b.clone()

b.backward(retain_graph=True)
print(a.grad)
b_clone.backward()
print(a.grad)
'''
tensor(2.)
tensor(4.)
'''
跨设备复制

方法很多,实际使用就用以下这种:

python 复制代码
device = "cuda:0" if torch.cuda.is_available() else "cpu"
temp = torch.tensor(2)
temp.to(deivce) # 如果有gpu就放到gpu.
temp = temp.cpu() # 复制到cpu上
相关推荐
吃茄子的猫38 分钟前
quecpython中&的具体含义和使用场景
开发语言·python
珠海西格电力42 分钟前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
じ☆冷颜〃1 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方1 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
启途AI1 小时前
2026免费好用的AIPPT工具榜:智能演示文稿制作新纪元
人工智能·powerpoint·ppt
TH_11 小时前
35、AI自动化技术与职业变革探讨
运维·人工智能·自动化
APIshop1 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
楚来客1 小时前
AI基础概念之八:Transformer算法通俗解析
人工智能·算法·transformer
风送雨1 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦2 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae