PyTorch 张量(Tensors)全面指南:从基础到实战

文章目录

    • 什么是张量?
    • 张量初始化方法
      • 1. 直接从数据创建
      • 2. 从 NumPy 数组转换
      • 3. 基于现有张量创建
      • 4. 使用随机值或常量
    • 张量属性
    • 张量操作
      • 设备转移
      • 索引和切片
      • 连接张量
      • 算术运算
      • 单元素张量转换
    • 原地操作(In-place Operations)
    • PyTorch 与 NumPy 互操作
      • 张量转 NumPy 数组
      • NumPy 数组转张量
    • 张量操作总结表
    • 最佳实践与注意事项

PyTorch Tensor Visualization

什么是张量?

张量(Tensors)是 PyTorch 中的核心数据结构,类似于数组和矩阵,但具有更强大的功能。在深度学习中,我们使用张量来表示:

  • 模型的输入和输出数据
  • 模型的参数(权重和偏置)
  • 中间计算过程中的数据

张量与 NumPy 的 ndarrays 类似,但有两大关键优势:

  1. GPU 加速:可在 GPU 或其他硬件加速器上运行
  2. 自动微分:支持自动求导,这对深度学习至关重要
import torch
import numpy as np

张量初始化方法

1. 直接从数据创建

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

2. 从 NumPy 数组转换

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

3. 基于现有张量创建

x_ones = torch.ones_like(x_data)  # 保留原始张量属性
x_rand = torch.rand_like(x_data, dtype=torch.float)  # 覆盖数据类型print(f"Ones Tensor:\n{x_ones}")
print(f"Random Tensor:\n{x_rand}")

4. 使用随机值或常量

shape = (2, 3)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor:\n{rand_tensor}")
print(f"Ones Tensor:\n{ones_tensor}")
print(f"Zeros Tensor:\n{zeros_tensor}")

张量属性

每个张量都有三个关键属性:

tensor = torch.rand(3, 4)print(f"Shape: {tensor.shape}")    # 形状
print(f"Datatype: {tensor.dtype}") # 数据类型
print(f"Device: {tensor.device}")  # 存储设备 (CPU/GPU)

张量操作

设备转移

# 转移到GPU(如果可用)
device = "cuda" if torch.cuda.is_available() else "cpu"
tensor = tensor.to(device)
print(f"Device after transfer: {tensor.device}")

索引和切片

tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}")tensor[:, 1] = 0  # 修改第二列
print(tensor)

连接张量

t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(f"Concatenated tensor:\n{t1}")

算术运算

# 矩阵乘法(三种等效方式)
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)
y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)# 逐元素乘法(三种等效方式)
z1 = tensor * tensor
z2 = tensor.mul(tensor)
z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

单元素张量转换

agg = tensor.sum()
agg_item = agg.item()  # 转换为Python标量
print(f"Sum value: {agg_item}, Type: {type(agg_item)}")

原地操作(In-place Operations)

原地操作直接修改张量内容,使用 _ 后缀表示:

print("Original tensor:")
print(tensor)tensor.add_(5)  # 原地加5
print("\nAfter in-place addition:")
print(tensor)

注意:虽然原地操作节省内存,但在自动微分中可能导致梯度计算问题,应谨慎使用。

PyTorch 与 NumPy 互操作

张量转 NumPy 数组

t = torch.ones(5)
n = t.numpy()
print(f"Tensor: {t}\nNumPy: {n}")# 修改张量会影响NumPy数组
t.add_(1)
print(f"\nAfter modification:\nTensor: {t}\nNumPy: {n}")

NumPy 数组转张量

n = np.ones(5)
t = torch.from_numpy(n)
print(f"NumPy: {n}\nTensor: {t}")# 修改NumPy数组会影响张量
np.add(n, 1, out=n)
print(f"\nAfter modification:\nNumPy: {n}\nTensor: {t}")

张量操作总结表

操作类型方法示例说明
创建torch.tensor(), torch.rand(), torch.zeros()多种初始化方式
属性.shape, .dtype, .device获取张量元数据
索引tensor[0], tensor[:, 1]类似NumPy的索引
运算torch.matmul(), tensor.sum()矩阵运算和归约
连接torch.cat(), torch.stack()合并多个张量
转换.numpy(), torch.from_numpy()与NumPy互转

最佳实践与注意事项

  1. 设备管理:明确张量所在的设备(CPU/GPU),避免不必要的设备间传输
  2. 数据类型:注意操作中的数据类型一致性,使用 .dtype 检查
  3. 内存共享:PyTorch 和 NumPy 数组共享内存,修改一个会影响另一个
  4. 自动微分:避免在需要梯度的计算图中使用原地操作
  5. 性能优化:对大规模数据使用 GPU 加速,对小规模操作可能 CPU 更高效
# 高效设备转移示例
if torch.cuda.is_available():tensor = tensor.to('cuda')# 保持数据类型一致
float_tensor = torch.rand(3, dtype=torch.float32)
int_tensor = torch.tensor([1, 2, 3], dtype=torch.int32)
result = float_tensor + int_tensor.float()  # 显式转换

掌握张量操作是使用 PyTorch 进行深度学习的基础。通过本文介绍的各种方法,您可以高效地创建、操作和转换张量,为构建复杂模型奠定坚实基础!

官方文档:https://docs.pytorch.org/tutorials/beginner/basics/tensorqs_tutorial.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/bicheng/86229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven是什么?

Maven是一个流行的Java项目管理和构建工具,主要用于自动化项目构建、依赖管理和项目文档生成等工作。以下是对它的简单介绍: 核心功能 依赖管理:自动管理项目所需的第三方库(如JAR包),通过在配置文件中声…

etcd教程-快速入门使用(截图实操)集群搭建 + 原理解释

大家好,我是此林。 etcd 是一个高可用的键值对存储系统,常用于分布式系统中保存配置、服务发现和协调信息。它是 CNCF 旗下的项目之一,也是 Kubernetes 的核心组件之一,用来存储集群状态。 可以说,云原生场景下经常使…

OpenSSL 混合加密

openssl 中文网: https://www.openssl.net.cn/ 目录 对称加密特点常见算法案例(使用 AES) 非对称加密特点常见算法案例(使用 RSA) 混合加密场景加密(使用 AES)解密 总结 对称加密 特点 加密和解…

AI驱动的DevOps运维与云服务部署自动化

引言 当前,云计算和DevOps实践让开发者能够管理成百上千台服务器和容器,但随之而来的运维复杂度也急剧提升。运维工程师经常需要部署多环境应用、维护大规模云主机、排查集群故障等任务。这些任务不仅涉及繁琐的脚本编写和命令行操作,还需要对…

Spring Boot动态数据源切换:优雅实现多数据源管理

在复杂的企业应用中,多数据源管理是常见需求。本文将介绍如何基于Spring Boot实现优雅的动态数据源切换方案,通过自定义注解和AOP实现透明化切换。 核心设计思路 通过三层结构实现数据源动态路由: 1. 注解层:声明式标记数据源 2…

如何挑选一款1588PTP时钟同步服务器​

在当今数字化程度极高的时代,高精度时间同步对于众多关键领域的高效、稳定运行起着决定性作用。PTP(精确时间协议)时钟作为实现高精度时间同步的核心设备,其性能优劣直接关乎系统整体表现。挑选一款合适的 ptp网络同步时钟&#x…

Harmony状态管理 @Local和@Param

深入理解ArkUI中的Param与Local装饰器 引言 在ArkUI的状态管理系统中,Param和Local是两个核心装饰器,它们分别用于处理组件间的数据传递和组件内部状态管理。本文将详细介绍这两个装饰器的使用场景、特性差异以及最佳实践。 Param装饰器:组…

物联网摄像头模块的应用场景

一、智慧城市治理 ‌智能交通优化‌ ‌动态信号控制‌:杭州部署20万物联网摄像头,实时分析车流密度并联动1200个红绿灯,早高峰通行效率提升40%。 ‌违规行为识别‌:搭载GB/T28181协议的摄像头AI抓拍交通违章,车牌识…

k8s Ingress、Service配置各样例大全

目录 壹、k8s Ingress 样例大全🔧 一、基础路由与 TLS 终止🔄 二、高级路由控制1. **URL 重写**(适用后端服务路径与入口路径不一致)2. **多路径路由到不同服务** 🚦 三、流量治理策略1. **金丝雀发布(灰度…

领域驱动设计(DDD)【10】之DDD战术模式:工厂模式与表意接口模式

文章目录 引言:DDD战术模式的重要性一、DDD中的工厂模式1.1 工厂模式的核心概念1.2 工厂模式的三种实现方式1.2.1 简单工厂方法1.2.2 工厂类1.2.3 抽象工厂模式 1.3 工厂模式的适用场景1.4 实际案例:电商订单系统 二、表意接口模式2.1 表意接口2.2 表意接…

鸿蒙ArkTS---登录逻辑,数据持久化,ArkUI,网络请求等基础内容记录

该内容是在【博学谷】学习过程中的代码记录,如有任何问题请与作者联系。 也欢迎同在学习鸿蒙开发的小伙伴的留言,一同学习,一同进步。 功能实现(只记录代码,没有相关配置,跑不起来)&#xff…

没有公网ip可以实现跨网p2p互通吗?内网让公网直连访问常用工具

没有公网IP的情况下仍然可以实现P2P通信,但需要借助NAT穿透技术或类似nat123同端口映射等第三方工具实现内网穿透‌。‌‌‌‌ 一、什么是P2P通信? P2P网络(Peer-to-Peer Network)是一种去中心化的网络架构,其中每个…

云服务器安装宝塔面板(BT Panel)

安装宝塔面板(BT Panel)是很多服务器管理员常用的操作,尤其适合用于管理网站、数据库、FTP等。以下是基于 Linux 系统(推荐 CentOS 或 Ubuntu)的宝塔面板安装步骤。 安装前准备 云服务器一台 可以订购服务器 海外云主…

mongoose解析http字段值

最近在使用mongoose开发嵌入式web后端时,会遇到要解析js前端发送过来的http消息,比如传递用户名,密码过来,后端要解析出来并判断是否登录成功。 前端http有两种组装字段的方式。 第一种是 $.ajax({url: /upgradePackage,method: P…

高德地图地址解析获取经纬度失败原因JSAPI

高德地图地址解析获取经纬度失败原因JSAPI 地图加载的时候老是报异常码,地图是可以加载出来的,但是在地图上的操作老是有异常码,找了好久不知道什么问题,异常码会报两种,一种是说什么key的问题,但是我当时…

极速JavaScript:全面性能优化实战指南

在现代Web开发中,JavaScript性能直接影响用户体验。一个优化良好的应用能带来更流畅的交互、更快的加载速度和更低的资源消耗。本文将深入探讨实用的JavaScript性能优化技术,帮助您打造高性能Web应用。 一、性能瓶颈分析与诊断工具 性能问题的常见来源&…

【开源模型】高考数学139分!小米MiMo开源模型:7B参数突出重围

小米 MiMo:7 B 参数撬动推理巅峰,开源模型的技术突围 70 亿参数超越 320 亿对手,高考数学 139 分的背后是训练策略的全面革新。 2025 年 4 月 30 日,小米开源的首个推理大模型 Xiaomi MiMo-7 B 横空出世,以​​仅 7 B …

用vscode破解最新typora1.10.8

1.下载格式化插件防止打开文件一团乱 1)下载vscode: Download Visual Studio Code - Mac, Linux, Windows 2)vscode下载中文插件重启 如果没变中文,在vscode界面按下: ctrl shift p 调出命令行 再输入&#xff…

在 CI/CD 流程中使用 Jenkins 与 Docker 集成

在 CI/CD 流程中,Jenkins 与 Docker 的集成可以实现自动构建、测试、打包、发布容器镜像,并部署到测试/生产环境。下面是从概念到落地操作的完整集成方案。 一、常见的集成方式有哪些? 方式描述1️⃣ Jenkins 主机安装 DockerJenkins 可以直…

闲庭信步使用SV搭建图像测试平台:第十课——继续说说类

(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程…