Tensors张量操作

简介: PyTorch中的`Tensor`是多维数组,类似NumPy的`ndarray`,但支持GPU加速。Tensor有属性如形状(shape)、数据类型(dtype)和存储位置(device),可创建并初始化为指定数值、从Numpy数组转换而来,或基于已有Tensor复制。Tensor可以在CPU和GPU之间移动,用于数据运算、拼接(如`torch.cat`进行连接)和转换(如与Numpy间转换,以及图像处理中的`transforms`)。通过`to()`方法可以灵活地改变Tensor的设备存储位置。

定义Tensor


下面是一个常见的tensor,包含了里面的数值,属性,以及存储位置


tensor([[0.3565,0.1826,0.6719],
        [0.6695,0.5364,0.7057]],dtype=torch.float32,device='cuda:0')

Tensor的属性


Tensor属性描述了它们的形状、数据类型和存储它们的设备(CPU 或 GPU)


import torch
tensor = torch.rand( 3,4)
print(f"shape of tensor: {tensor. shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor. device}")

Shape of tensor: torch.size([3,4])

Datatype of tensor: torch.float32

Device tensor is stored on: cpu


Tensor存储的数值


Tensor 可以用多种方法进行初始化。


直接传数据


Tensor可以直接从数据进行创建,数据类型会自动适应。


import torch
data =[[1,2],[3,4]]
x_data = torch.tensor(data)
print(x_data)


tensor([[1,2],

       [3,4]])


使用Numpy数据


可以通过Numpy矩阵中进行创建


import torch
import numpy as np
np_array = np. array ([[1,2],
                       [3,4]])
x_np = torch.from_numpy ( np_array)
print(x_np)


利用已有tensor


根据已有的数据形式(形状,数据类型),创建出新的tensor


data = [[1,2],[3,4]]
x_data = torch.tensor(data)
# 保持了x_data的数据属性与形状
x_ones = torch.ones_like(x_data)
print(f"ones Tensor: \n {x_ones} \n")
# 保持形状不变但改变数据属性的新张量
x_rand = torch.rand_like(x_data,dtype=torch.float)
print(f"Random Tensor: \n {x_rand} \n")


Tensor存储的位置


Tensor可以保存在GPU中,或者保存在CPU中,在二者中可以进行切换


  1. GPU中进行运算(前向传播、反向传播)
  2. CPU中进行数据读取(从内存读取数据)与写入(保存到硬盘中)


CPU->GPU


import torch
shape = (2, 3, )
rand_tensor = torch.rand( shape)
print(rand_tensor)
if torch.cuda.is_available( ) :
    rand_tensor = rand_tensor.cuda()
print(rand_tensor)


输出:


tensor([[e.3565,0.1826,0.6719],
        [e.6695,0.5364,0.7057]])
tensor([[e.3565,0.1826,0.6719],
        [e.6695,0.5364,0.7057]],device= 'cuda:e ')


GPU->CPU


shape = (2, 3,)
rand_tensor = torch.rand( shape)
print(rand_tensor)
if torch.cuda.is_available( ):
    rand_tensor = rand_tensor.cuda()
print( rand_tensor)
cpu_tensor = rand _tensor.cpu()
print(cpu_tensor)


使用to()自动进行切换张量存储位置:


这个方法非常灵活,可以自动处理类型转换和设备迁移。


device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  
# 检查并设置设备
x_cpu = torch.tensor([[1., 2.], [3., 4.]])  
# 在CPU上的张量
x_gpu = x_cpu.to(device)  
# 移动到GPU


数据的运算


这些操作中的每一个都可以在GPU上运行(通常比在CPU上运行的速度更快)。


tensor = torch.tensor([[1,2]
                       [ 3,4]])
#矩阵乘法
result_1 = tensor @ tensor
print( result_1)
print("矩阵乘法,result_1 = \n", result_1)
#矩阵对应位置的元素相乘
result_2 = tensor *tensor
print("元素乘法,result_2 = \n", result_2)
result_3 = tensor + tensor
print("元素加法,result_3 = \n" , result_3)
agg = tensor.sum( )
agg_item = agg.item()#使用item()获取里面的值
print("求和,agg_item = " , agg_item,type( agg_item) )


在PyTorch中,当你想要从一个标量张量(即形状为(1,)或者空的张量)中提取出Python的原生数值(例如整数、浮点数)时,可以使用.item()方法。这个方法会返回张量中的数据,将其转换为Python的基本数据类型。


import torch
 
# 一个包含单个浮点数的张量
tensor_with_one_value = torch.tensor([3.5])
 
# 使用.item()方法提取该值
value = tensor_with_one_value.item()
 
print(value)  # 输出: 3.5


Tensor的拼接


将两个或者多个tensor进行拼接(concat),使用 torch.cat对tensor沿着一个特定的维度进行拼接。


tensor_1 = torch.tensor([[1,2,3,4]])
tensor_2 = torch.tensor([[5,6,7,8]])
print(torch.cat([tensor_1,tensor_2],dim=0))
print(torch.cat([tensor_1,tensor_2],dim=1))


我们平时的张量有两个维度↓和→:


↓就是0维度,→就是1维度。


tensor([[1,2,3,4]
        [5,6,7,8]])
tensor([[1,2,3,4,5, 6,7,8]])

数据的转换


NumpyTensor


import torch
import numpy as np
n=np.ones ( 5)
t = torch.from_numpy(n)
 
# 
[1. 1.1.1. 1.]
tensor([1., 1., 1., 1., 1.],dtype=torch.float64)


TensorNumpy


t = torch. ones ( 5)
n= t.numpy ()


图片转Tensor


from PIL import Image
from torchvision import transforms
image_path = r'image.png'
image = Image.open(image_path)
transform = transforms.ToTensor()
tensor_image = transform( image)
print(type(tensor_image) )
 
# <class 'torch . Tensor' >


Tensor转图片


import torch
from torchvision import transforms
tensor_image = torch.randn( ( 3,224,224))
transformed_image = transforms.ToPILImage( )(tensor_image)
save_path = r "form_tensor .jpg'
#保存图像
transformed_image.save( save_path)


transforms模块是torchvision库中的一个重要组成部分,它提供了一系列预定义的图像转换方法,用于对图像数据进行各种预处理,如裁剪、缩放、旋转、归一化等,以便于输入深度学习模型进行训练或测试。


比如ToTensor:将PIL Image或numpy.ndarray转换为torch.FloatTensor,范围从[0, 255]变为[0.0, 1.0]。


比如Normalize:对图像像素值进行归一化处理,常用于使数据分布更加一致,加速模型收敛。


transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])


PyTorch处理图片案例


模拟从硬盘读取一张图片,使用pytorch在显卡上进行运算,随后把运算结果保存到硬盘


import torch
from torchvision import transforms
from PIL import Image
image_path = r"image.png"
save_path = r"result.png"
#加载图片
image = Image.open( image_path)
 
transform = transforms. ToTensor()
#应用转换
tensor_image = transform( image)
print(tensor_image)
#检查CuDA是否可用并将tensor移至CUDA
if torch.cuda.is_available( ) :
    tensor_image = tensor_image.to( ' cuda ')
# 对每个元素加一
tensor_image += 0.1
# 将tensor移回CPU并转换回PIL图像
tensor_image = tensor_image.to( ' cpu ')
transformed_image = transforms.ToPILImage()(tensor_image)
#保存图像
transformed_image.save( save_path)
相关实践学习
部署Stable Diffusion玩转AI绘画(GPU云服务器)
本实验通过在ECS上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。
目录
打赏
0
3
5
0
50
分享
相关文章
RFID库房进出入管理
RFID库房进出管理通过在货物或货箱上安装RFID标签,实现自动化信息采集,无需人工记录或扫描条码,大幅提升效率。系统结合入口、出口及内部关键位置的RFID阅读器,实时监控货物流动与位置变化。后台管理系统支持货物信息管理、库存盘点、出入库记录等功能,减少人工错误,优化库房作业流程。手持设备和固定阅读器配合使用,快速完成盘点并生成差异报告。RFID技术助力可视化管理,降低时间成本,提高准确性,为库存优化提供可靠支持。
5分钟掌握开源图神经网络框架DGL使用
近几年神经网络在人工智能领域的成功应用,让它备受关注和热捧。但是,它自身依然具有本质上的局限性,以往的神经网络都是限定在欧式空间内,这和大多数实际应用场景并不符合,因此,也阻碍了它在很多领域的实际落地应用。
5分钟掌握开源图神经网络框架DGL使用
盘点Tomcat中常见的13种设计模式
【10月更文挑战第6天】本文深入探讨了Tomcat中常见的13种设计模式,包括单例模式、工厂模式、适配器模式、装饰者模式、组合模式、外观模式、享元模式、责任链模式、命令模式、迭代器模式、观察者模式、策略模式和模板方法模式。通过具体示例,展示了这些设计模式如何协同工作,支撑起Tomcat的高性能和高灵活性。
Python机器学习:Scikit-learn库的高效使用技巧
【10月更文挑战第28天】Scikit-learn 是 Python 中最受欢迎的机器学习库之一,以其简洁的 API、丰富的算法和良好的文档支持而受到开发者喜爱。本文介绍了 Scikit-learn 的高效使用技巧,包括数据预处理(如使用 Pipeline 和 ColumnTransformer)、模型选择与评估(如交叉验证和 GridSearchCV)以及模型持久化(如使用 joblib)。通过这些技巧,你可以在机器学习项目中事半功倍。
185 3
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
本文介绍了labelImg和labelme两款图像标注工具的安装、使用、数据转换和验证方法,适用于目标检测和图像分割任务,支持YOLO等数据集格式。
1778 2
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
利用环境变量管理敏感信息
【10月更文挑战第16天】在软件开发中,环境变量是管理敏感信息如API密钥、数据库密码等的安全方式,避免了将这些信息硬编码在源代码中。本文介绍了环境变量的概念、优势及如何在应用中实施,包括本地开发、CI/CD流程和云服务中的应用,以及实战技巧和最佳实践。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问