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

【PyTorch实战:Tensor变形】5、 PyTorch Tensor指南:从基础操作到Autograd与GPU加速实战

在这里插入图片描述

一、Tensor核心概念解析

1.1 什么是Tensor?

Tensor是PyTorch中最基本的数据结构,也是深度学习框架的核心计算单元。我们可以将Tensor理解为多维数组的统一表示,它在PyTorch中的地位相当于NumPy中的ndarray,但具有两个关键增强特性:GPU加速支持自动求导能力
在这里插入图片描述

1.2 为什么需要Tensor?

PyTorch重新设计Tensor而不是直接使用NumPy数组,主要基于两个深度学习的关键需求:

  1. GPU加速:深度学习涉及大量并行计算,GPU拥有数千个核心,非常适合处理Tensor这样的海量数据。Tensor可以轻松在CPU和GPU之间切换,实现计算加速。
  2. 自动求导:神经网络训练的核心是计算梯度。Tensor的requires_grad属性可以标记需要计算梯度的参数,PyTorch的Autograd引擎会自动追踪所有相关运算并计算梯度。

简单公式表示:PyTorch Tensor = NumPy Array + GPU Support + Autograd

二、Tensor的创建与数据类型

2.1 基本创建方式

PyTorch提供了多种创建Tensor的方法,与NumPy的API设计高度一致:

import torch
import numpy as np# 从Python列表直接创建
x = torch.tensor([1, 2, 3, 4])
print(f"从列表创建的Tensor: {x}")# 使用内置函数创建特殊Tensor
zeros = torch.zeros(2, 3)    # 创建2x3的全0Tensor
ones = torch.ones(2, 3)      # 创建2x3的全1Tensor
rand_tensor = torch.rand(2, 3)  # 创建2x3的Tensor,元素来自[0,1)均匀分布
randn_tensor = torch.randn(2, 3) # 创建2x3的Tensor,元素来自标准正态分布
arange_tensor = torch.arange(0, 10, 2) # 类似range,tensor([0, 2, 4, 6, 8])
eye_tensor = torch.eye(3)    # 创建3x3的单位矩阵# 指定数据类型和设备创建
special_tensor = torch.tensor([1, 2, 3], dtype=torch.float32, device='cuda' if torch.cuda.is_available() else 'cpu')

2.2 Tensor数据类型详解

PyTorch Tensor支持多种数据类型,每种类型都有特定的使用场景:

数据类型 对应PyTorch类 说明 常见用途
32位浮点 torch.float32 单精度浮点数 深度学习中最常用的类型
64位浮点 torch.float64 双精度浮点数 高精度数值计算
16位浮点 torch.float16 半精度浮点数 GPU内存紧张时使用
8位无符号整型 torch.uint8 无符号8位整数 图像处理(0-255像素值)
8位有符号整型 torch.int8 有符号8位整数 量化模型
32位整型 torch.int32 32位整数 一般整数运算
64位整型 torch.int64 64位整数 索引和标签(常用)
布尔型 torch.bool 布尔类型 掩码和条件运算
# 数据类型示例
float_tensor = torch.tensor([1.0, 2.0, 3.0], dtype=torch.float32)
int_tensor = torch.tensor([1, 2, 3], dtype=torch.int64)
bool_tensor = torch.tensor([True, False, True], dtype=torch.bool)# 数据类型转换
original = torch.tensor([1, 2, 3])  # 默认int64
converted = original.float()        # 转换为float32
print(f"原始类型: {original.dtype}, 转换后类型: {converted.dtype}")

2.3 特殊Tensor创建方法

除了基本创建方法,PyTorch还提供了多种特殊Tensor的创建函数:

# 创建与现有Tensor相同形状的Tensor
example = torch.randn(3, 4)
zeros_like = torch.zeros_like(example)  # 与example形状相同的全0Tensor
ones_like = torch.ones_like(example)    # 与example形状相同的全1Tensor
rand_like = torch.rand_like(example)    # 与example形状相同的随机Tensor# 创建线性空间Tensor
linear_space = torch.linspace(0, 10, 5)  # tensor([0., 2.5, 5., 7.5, 10.])
log_space = torch.logspace(0, 2, 3)      # tensor([1., 10., 100.])# 创建随机排列
random_perm = torch.randperm(10)         # 0-9的随机排列# 创建对角Tensor
diagonal = torch.diag(torch.tensor([1, 2, 3]))  # 对角线为1,2,3的矩阵

三、Tensor属性详解

3.1 核心属性

每个Tensor都有多个重要属性,用于描述其特征和状态:

# 创建一个示例Tensor
t = torch.randn(2, 3, 4, requires_grad=True)print("形状:", t.shape)        # torch.Size([2, 3, 4])
print("维度数:", t.dim())       # 3
print("元素总数:", t.numel())   # 24
print("数据类型:", t.dtype)     # torch.float32
print("设备:", t.device)       # cpu 或 cuda:0
print("是否需要梯度:", t.requires_grad)  # True
print("是否连续存储:", t.is_contiguous())  # True
print("梯度:", t.grad)         # None (尚未计算梯度)

3.2 设备属性与GPU加速

Tensor的设备属性决定了它在何处进行计算,这对于深度学习性能至关重要:

# 检查GPU可用性
cuda_available = torch.cuda.is_available()
print(f"CUDA可用: {cuda_available}")# 设备无关的代码编写方式
device = torch.device("cuda" if cuda_available else "cpu")
print(f"使用设备: {device}")# 创建时指定设备
x = torch.tensor([1, 2, 3], device=device)# 在设备间移动Tensor
if cuda_available:cpu_tensor = torch.ones(3)gpu_tensor = cpu_tensor.to('cuda')  # 移动到GPUback_to_cpu = gpu_tensor.cpu()      # 移回CPU# 使用.to()方法同时改变设备和数据类型transformed = cpu_tensor.to('cuda', dtype=torch.float64)

3.3 梯度追踪与requires_grad

requires_grad是PyTorch Tensor最独特的属性之一,它开启了自动求导功能:

# 创建需要梯度的Tensor(模型参数)
weights = torch.randn(5, 3, requires_grad=True)
bias = torch.zeros(3, requires_grad=True)# 创建不需要梯度的Tensor(输入数据)
input_data = torch.randn(10, 5, requires_grad=False)# 前向传播(自动构建计算图)
output = input_data @ weights + bias  # 矩阵乘法和加法
loss = output.pow<

文章转载自:

http://LTsgimda.pctqL.cn
http://d6TAhX9X.pctqL.cn
http://XCcExOiH.pctqL.cn
http://UvxIX5ny.pctqL.cn
http://1Z5pxqgP.pctqL.cn
http://4oOeJdwc.pctqL.cn
http://nWEBjsCo.pctqL.cn
http://YpUcpreY.pctqL.cn
http://MmFB74FM.pctqL.cn
http://McDN8gE6.pctqL.cn
http://Mq96yaTe.pctqL.cn
http://jw6dAIFp.pctqL.cn
http://2DXCl6pw.pctqL.cn
http://BWgo6NLE.pctqL.cn
http://WGMZfnan.pctqL.cn
http://qLPJcGwo.pctqL.cn
http://kDejxEcX.pctqL.cn
http://V29GwzHQ.pctqL.cn
http://pO0buYtl.pctqL.cn
http://tE4oBYTv.pctqL.cn
http://xdGn4Im7.pctqL.cn
http://uacHPbDR.pctqL.cn
http://qawE4IMl.pctqL.cn
http://f6fFwDhV.pctqL.cn
http://R3OMwnYm.pctqL.cn
http://5IBM7Aqm.pctqL.cn
http://J0XHL6l1.pctqL.cn
http://jN4dElrQ.pctqL.cn
http://2SIEBIU8.pctqL.cn
http://AofLdfSh.pctqL.cn
http://www.dtcms.com/a/370471.html

相关文章:

  • 【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。
  • 驱动开发系列71 - GLSL编译器实现 - 指令选择
  • 贪心算法应用:化工反应器调度问题详解
  • OpenAvatarChat项目在Windows本地运行指南
  • canal+DataX实现数据全量/实时同步
  • Jenkins运维之路(自动获得分支tag自动构建)
  • 服务器内存和普通计算机内存在技术方面有什么区别?
  • 同一台nginx中配置多个前端项目的三种方式
  • 【LeetCode热题100道笔记】排序链表
  • Shell 脚本实现系统监控与告警
  • 【算法--链表】86.分割链表--通俗讲解
  • 基于区块链的IoMT跨医院认证系统:Python实践分析
  • 用内存顺序实现 三种内存顺序模型
  • rh134第五章复习总结
  • Java包装类型
  • Linux awk 命令使用说明
  • 一个正常的 CSDN 博客账号,需要做哪些基础准备?
  • 文件I/O与I/O多路复用
  • protobuf的序列反序列化
  • Linux/UNIX系统编程手册笔记:共享库、进程间通信、管道和FIFO、内存映射以及虚拟内存操作
  • 吴恩达机器学习(九)
  • 基于多级特征编码器用于声学信号故障检测模型
  • 【LeetCode热题100道笔记】二叉树中的最大路径和
  • The Open Group 宣布成立Industrial Advanced Nuclear™ 联盟)
  • 问题:指令译码前控制信号还没有产生,那么如何控制译码前指令的动作呢?
  • 软件测试理论
  • Wisdom SSH 是一款创新性工具,通过集成 AI 助手,为服务器性能优化带来极大便利。
  • ChatGPT下的相关聊天提示词
  • C# WinForm分页控件实现与使用详解
  • 在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南