😉如果您想用jupyter notebook跑我的笔记,可以在下面获取ipynb版本
😊麻烦给个免费的star😘
❤️主包也更建议这种形式,上面的笔记也更加全面,每一步都有直观的输出
文章目录
- [📚 PyTorch张量操作与自动微分全面指南](#📚 PyTorch张量操作与自动微分全面指南)
-
- [🛠 1. 准备工作](#🛠 1. 准备工作)
-
- [1.1 导入PyTorch并检查环境](#1.1 导入PyTorch并检查环境)
- [1.2 设置计算设备](#1.2 设置计算设备)
- [📦 1.1 张量初始化](#📦 1.1 张量初始化)
-
- [1.1.1 从Python数据类型创建](#1.1.1 从Python数据类型创建)
- [1.1.2 数据类型处理](#1.1.2 数据类型处理)
- [1.1.3 从NumPy数组创建](#1.1.3 从NumPy数组创建)
- [1.1.4 特殊张量创建](#1.1.4 特殊张量创建)
- [1.1.5 张量属性查看](#1.1.5 张量属性查看)
- [1.1.6 张量设备转移](#1.1.6 张量设备转移)
- [➗ 1.2 张量运算](#➗ 1.2 张量运算)
-
- [1.2.1 基本运算](#1.2.1 基本运算)
- [1.2.2 张量转换](#1.2.2 张量转换)
- [1.2.3 形状操作](#1.2.3 形状操作)
- [🔁 1.3 张量自动微分](#🔁 1.3 张量自动微分)
-
- [1.3.1 梯度计算核心概念](#1.3.1 梯度计算核心概念)
- [1.3.2 梯度计算实战](#1.3.2 梯度计算实战)
- [1.3.3 梯度控制技巧](#1.3.3 梯度控制技巧)
- [💎 核心要点总结](#💎 核心要点总结)
📚 PyTorch张量操作与自动微分全面指南
PyTorch作为深度学习领域的主流框架,掌握其核心数据结构张量(Tensor)的操作至关重要。本文将全面解析PyTorch张量的创建、运算和自动微分机制,助你快速上手PyTorch开发!🚀
🛠 1. 准备工作
1.1 导入PyTorch并检查环境
python
# 导入torch库
import torch
# 查看torch版本
print(torch.__version__) # 输出: 2.6.0+cu124
# 检查CUDA是否可用
torch.cuda.is_available() # 输出: True
1.2 设置计算设备
python
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device) # 输出: cuda
📦 1.1 张量初始化
1.1.1 从Python数据类型创建
python
data = [[1,2],[3,4]]
x = torch.tensor(data)
print(x)
# 输出:
# tensor([[1, 2],
# [3, 4]])
1.1.2 数据类型处理
python
# 查看数据类型
print(x.dtype) # 输出: torch.int64
# 指定数据类型创建
x1 = torch.FloatTensor([[1,2],[3,4]]) # 等价于 torch.tensor(..., dtype=torch.float32)
x2 = torch.LongTensor([[1,2],[3,4]])
# 强制类型转换
x1 = x1.type(torch.long) # 转换为int64
x1 = x1.float() # 转换为float32
💡 关键提示 :
torch.float32
和torch.int64
是最重要的数据类型!模型输入通常是float32,分类标签通常是int64
1.1.3 从NumPy数组创建
python
import numpy as np
data = np.array([[1,2],[4,3]])
x3 = torch.from_numpy(data)
print(x3)
# 输出:
# tensor([[1, 2],
# [4, 3]])
1.1.4 特殊张量创建
python
# 创建随机张量
rand_tensor = torch.rand(2,3) # 0~1均匀分布
randn_tensor = torch.randn(2,3) # 标准正态分布
# 创建全1/全0张量
ones_tensor = torch.ones(2,3)
zeros_tensor = torch.zeros(2,3)
# 继承形状创建
y1 = torch.rand_like(x.float())
1.1.5 张量属性查看
python
t = x
print(t.shape) # 形状: torch.Size([2, 2])
print(t.size()) # 大小: torch.Size([2, 2])
print(t.dtype) # 数据类型: torch.int64
print(t.device) # 存储设备: cpu
1.1.6 张量设备转移
python
x_gpu = x.to(device) # 转移到GPU
print(x_gpu.device) # 输出: cuda:0
➗ 1.2 张量运算
1.2.1 基本运算
python
# 就地加法 (会改变原张量)
t1 = torch.randn(2,3)
t2 = torch.ones(2,3)
t2.add_(t1)
# 矩阵乘法
result1 = t1 @ t2.T
result2 = t1.matmul(t2.T)
1.2.2 张量转换
python
# 单元素张量转标量
t3 = t1.sum()
scalar = t3.item() # 输出: 2.1050655841827393
# 张量转NumPy数组
numpy_array = t1.numpy()
1.2.3 形状操作
python
t = torch.randn(4,6)
# 重塑形状
t1 = t.view(3,8) # 显式指定形状
t2 = t.view(-1,1) # 自动推断维度
t3 = t.view(1,4,6) # 增加维度
# 维度压缩与扩展
t4 = torch.ones(1,4,6)
t5 = torch.squeeze(t4) # 移除大小为1的维度
t6 = torch.unsqueeze(t5,0) # 在指定位置添加维度
🔁 1.3 张量自动微分
1.3.1 梯度计算核心概念
PyTorch的自动微分系统基于以下三个关键属性:
requires_grad
:是否跟踪梯度(默认为False)grad
:存储计算得到的梯度grad_fn
:指向生成此张量的运算方法
1.3.2 梯度计算实战
python
# 创建需要跟踪梯度的张量
t = torch.ones(2,2, requires_grad=True)
print(t.requires_grad) # 输出: True
# 构建计算图
y = t + 5
x = y * 2
out = x.mean()
# 反向传播计算梯度
out.backward()
# 查看梯度
print(t.grad)
# 输出:
# tensor([[0.5000, 0.5000],
# [0.5000, 0.5000]])
1.3.3 梯度控制技巧
python
# 临时禁用梯度跟踪
with torch.no_grad():
print((t + 2).requires_grad) # 输出: False
# 获取不跟踪梯度的张量副本
detached_t = t.detach()
print(detached_t.requires_grad) # 输出: False
# 永久关闭梯度跟踪
t.requires_grad_(False)
print(t.requires_grad) # 输出: False
💎 核心要点总结
-
张量创建:
- 使用
torch.tensor()
从Python数据创建 - 使用
torch.from_numpy()
从NumPy数组转换 - 掌握
torch.rand()
,torch.randn()
,torch.ones()
,torch.zeros()
等创建方法
- 使用
-
数据类型管理:
- 重点掌握
float32
(模型输入)和int64
(分类标签) - 使用
.float()
和.long()
快速转换类型
- 重点掌握
-
设备转移:
- 使用
.to(device)
在CPU/GPU间移动张量 - 始终检查
tensor.device
确保张量位置正确
- 使用
-
自动微分:
- 设置
requires_grad=True
启用梯度跟踪 - 使用
.backward()
自动计算梯度 - 使用
with torch.no_grad():
上下文管理器禁用梯度计算
- 设置
-
性能优化:
- 尽量使用就地操作(如
add_()
)减少内存开销 - 合理使用
view()
进行形状重塑 - 及时使用
detach()
分离不需要的计算图
- 尽量使用就地操作(如
掌握这些PyTorch张量核心操作,你已为深度学习模型开发打下坚实基础!🎯 下一步可以探索神经网络模块和优化器的使用,开启模型训练之旅!