tensor
😉如果您想用jupyter notebook跑我的笔记,可以在下面获取ipynb版本
😊麻烦给个免费的star😘
❤️主包也更建议这种形式,上面的笔记也更加全面,每一步都有直观的输出
文章目录
- 📚 PyTorch张量操作与自动微分全面指南
- 🛠 1. 准备工作
- 1.1 导入PyTorch并检查环境
- 1.2 设置计算设备
- 📦 1.1 张量初始化
- 1.1.1 从Python数据类型创建
- 1.1.2 数据类型处理
- 1.1.3 从NumPy数组创建
- 1.1.4 特殊张量创建
- 1.1.5 张量属性查看
- 1.1.6 张量设备转移
- ➗ 1.2 张量运算
- 1.2.1 基本运算
- 1.2.2 张量转换
- 1.2.3 形状操作
- 🔁 1.3 张量自动微分
- 1.3.1 梯度计算核心概念
- 1.3.2 梯度计算实战
- 1.3.3 梯度控制技巧
- 💎 核心要点总结
📚 PyTorch张量操作与自动微分全面指南
PyTorch作为深度学习领域的主流框架,掌握其核心数据结构张量(Tensor)的操作至关重要。本文将全面解析PyTorch张量的创建、运算和自动微分机制,助你快速上手PyTorch开发!🚀
🛠 1. 准备工作
1.1 导入PyTorch并检查环境
# 导入torch库
import torch# 查看torch版本
print(torch.__version__) # 输出: 2.6.0+cu124# 检查CUDA是否可用
torch.cuda.is_available() # 输出: True
1.2 设置计算设备
device = "cuda" if torch.cuda.is_available() else "cpu"
print(device) # 输出: cuda
📦 1.1 张量初始化
1.1.1 从Python数据类型创建
data = [[1,2],[3,4]]
x = torch.tensor(data)
print(x)
# 输出:
# tensor([[1, 2],
# [3, 4]])
1.1.2 数据类型处理
# 查看数据类型
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数组创建
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 特殊张量创建
# 创建随机张量
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 张量属性查看
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 张量设备转移
x_gpu = x.to(device) # 转移到GPU
print(x_gpu.device) # 输出: cuda:0
➗ 1.2 张量运算
1.2.1 基本运算
# 就地加法 (会改变原张量)
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 张量转换
# 单元素张量转标量
t3 = t1.sum()
scalar = t3.item() # 输出: 2.1050655841827393# 张量转NumPy数组
numpy_array = t1.numpy()
1.2.3 形状操作
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 梯度计算实战
# 创建需要跟踪梯度的张量
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 梯度控制技巧
# 临时禁用梯度跟踪
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张量核心操作,你已为深度学习模型开发打下坚实基础!🎯 下一步可以探索神经网络模块和优化器的使用,开启模型训练之旅!