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

Pytorch使用手册-Tensors(专题二)

这段代码是对 PyTorch 中张量(Tensors)的详细介绍和操作演示。以下是逐步讲解:


1. 什么是张量 (Tensor)

张量是一种专门的数据结构,与 NumPy 的多维数组(ndarray)类似:

  • 它可以在 GPU 或其他硬件加速器上运行。
  • 张量可以与 NumPy 共享内存,避免不必要的数据拷贝。
  • 它是为自动微分(automatic differentiation)优化的,支持深度学习中的反向传播。

2. 初始化张量

张量可以通过多种方式初始化:

(a) 直接从数据创建
data = [[1, 2], [3, 4]]
x_data = torch.tensor(data)

通过 Python 的嵌套列表直接创建张量,PyTorch 会自动推断数据类型。


(b) 从 NumPy 数组创建
np_array = np.array(data)
x_np = torch.from_numpy(np_array)

可以从 NumPy 数组生成张量,且两者共享底层内存,修改其中之一会影响另一个。


© 从其他张量创建
x_ones = torch.ones_like(x_data)  # 保留形状和数据类型
x_rand = torch.rand_like(x_data, dtype=torch.float)  # 修改数据类型

基于已有张量创建新张量,可以选择保留或覆盖原张量的属性。


(d) 随机或常数值初始化
shape = (2, 3)
rand_tensor = torch.rand(shape)  # 随机数
ones_tensor = torch.ones(shape)  # 全1
zeros_tensor = torch.zeros(shape)  # 全0

通过 shape 参数定义张量的维度,生成对应形状的随机、全 1 或全 0 张量。


3. 张量的属性

张量的属性包括:

  • 形状 (shape): 表示张量的维度。
  • 数据类型 (dtype): 张量中元素的数据类型。
  • 存储设备 (device): 张量所在的设备(CPU/GPU)。
示例代码:
tensor = torch.rand(3, 4)
print(f"Shape of tensor: {tensor.shape}")  # (3, 4)
print(f"Datatype of tensor: {tensor.dtype}")  # float32
print(f"Device tensor is stored on: {tensor.device}")  # 默认 CPU

4. 张量操作

PyTorch 提供了多种张量操作,支持线性代数、矩阵操作、索引切片等。

(a) 索引与切片
tensor = torch.ones(4, 4)
print(tensor[0])           # 第一行
print(tensor[:, 0])        # 第一列
print(tensor[..., -1])     # 最后一列
tensor[:, 1] = 0           # 将第二列的值改为0

(b) 张量拼接

使用 torch.cat 在指定维度上拼接多个张量:

t1 = torch.cat([tensor, tensor, tensor], dim=1)  # 沿列拼接

© 算术运算
  • 矩阵乘法

    y1 = tensor @ tensor.T           # 矩阵乘法
    y2 = tensor.matmul(tensor.T)     # 等价操作
    torch.matmul(tensor, tensor.T, out=y3)  # 将结果写入 y3
    
  • 元素级运算

    z1 = tensor * tensor
    z2 = tensor.mul(tensor)
    torch.mul(tensor, tensor, out=z3)  # 将结果写入 z3
    

(d) 单元素张量

当张量通过聚合操作(如 sum())变成一个元素时,可以使用 item() 转换为 Python 标量:

agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))  # 输出值和数据类型

(e) 原地操作

在原地修改张量的操作以 _ 结尾,如 add_

tensor.add_(5)  # 张量加5并修改自身

注意:原地操作节省内存,但可能影响梯度计算,因此需谨慎使用。


5. PyTorch 与 NumPy 的桥接

PyTorch 张量与 NumPy 数组可以共享内存,因此两者的修改是同步的。

(a) 张量转 NumPy
t = torch.ones(5)
n = t.numpy()
t.add_(1)
print(t, n)  # t 和 n 的值都更新了
(b) NumPy 转张量
n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n)
print(t, n)  # t 和 n 的值都更新了

6. 张量在 GPU 上操作

默认情况下,张量是在 CPU 上创建的。如果需要加速计算,可以将张量移动到 GPU:

if torch.cuda.is_available():tensor = tensor.to("cuda")

总结

这段代码展示了张量的基本操作,包括创建、索引、拼接、算术运算以及 PyTorch 与 NumPy 的桥接。张量是 PyTorch 的核心数据结构,它既支持灵活的计算,也能高效地运行在硬件加速器上。


http://www.mrgr.cn/news/77739.html

相关文章:

  • 智慧环保生态文明信息化解决方案
  • 如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性
  • mac安装Pytest、Allure、brew
  • js作用域超全介绍--全局作用域、局部作用、块级作用域
  • Tomcat 与 Servlet 的关系:传统与 Spring Boot 中的差异
  • vmware集群 vSAN HCL 数据库
  • AP+AC组网——STA接入
  • Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
  • 51c大模型~合集76
  • 如何将文件Copy到Docker镜像中
  • 雅思阅读TFNG题型7大解题思路
  • Go语言中的条件变量:sync.NewCond
  • 【数据库入门】关系型数据库入门及SQL语句的编写
  • 封装实现通用的 `forEach` 函数:深入JavaScript的迭代机制与细节优化
  • 历遍单片机下的IIC设备[ESP--0]
  • 配置Springboot+vue项目在ubuntu20.04
  • docker-compose快速编排docker容器
  • 如何使用 ChatGPT 进行关键字研究
  • 对 TypeScript 中类是怎么理解的?都有哪些应用场景?
  • Vue 如何简单更快的对 TypeScript 中接口的理解?应用场景?
  • 使用Mac下载MySQL修改密码
  • vscode 远程连接ssh 密钥方式
  • Python 神经网络项目常用语法
  • 葡萄酒(wine)数据集——LDA、贝叶斯判别分析
  • 力扣整理版八:回溯算法(待更新)
  • ReactPress vs VuePress vs WordPress