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

发布于:2025-09-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

在这里插入图片描述

一、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')  # 移动到GPU
    back_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<

网站公告

今日签到

点亮在社区的每一天
去签到