PyTorch深度学习基础(一):张量 Tensor 与基本数据操作详解
本系列目标:从零开始学习深度学习基础,掌握 PyTorch 编程核心工具,为后续学习神经网络、CNN、Transformer、大模型等内容打下基础。
在深度学习中,我们每天都在处理大量的数据,例如:
- 图片:二维像素矩阵
- 文本:词向量序列
- 蛋白质序列:氨基酸编码矩阵
- 图结构:节点和边的特征矩阵
这些数据最终都会被转换为一种统一的数据结构:
Tensor(张量)
PyTorch 中最核心的数据结构就是 Tensor。
本节我们将学习:
- 什么是 Tensor?
- 如何创建 Tensor?
- Tensor 的形状和维度
- Tensor 基本运算
- 广播机制
- 索引与切片
- 内存优化
- Tensor 与 NumPy 转换
1. PyTorch简介
PyTorch 是目前最流行的深度学习框架之一,由 Meta AI 开发。
它提供:
- 自动求导机制(Autograd)
- GPU 加速计算
- 神经网络模块(torch.nn)
- 优化算法(torch.optim)
- 大量深度学习工具
安装完成后,我们首先导入 PyTorch:
importtorch注意:
虽然框架名字叫PyTorch,
但是 Python 中导入模块使用:
torch而不是:
pytorch2. 什么是Tensor(张量)
Tensor定义
Tensor 可以理解为:
一个包含数字的数据容器,是深度学习中存储数据的基本单位。
例如:
标量 Scalar
一个数字:
x=5 x = 5x=5
对应:
torch.tensor(5)向量 Vector
一维数组:
x=[1,2,3,4]x = \begin{bmatrix}1,2,3,4 \end{bmatrix}x=[1,2,3,4]
代码:
x=torch.tensor([1,2,3,4])矩阵 Matrix
二维数组:
X=[1234] X= \begin{bmatrix} 1&2\\ 3&4 \end{bmatrix}X=[1324]
代码:
torch.tensor([[1,2],[3,4]])高维Tensor
例如:
图片:
Height×Width×Channel Height×Width×ChannelHeight×Width×Channel
RGB图片:
224×224×3 224×224×3224×224×3
Batch图片:
Batch×Channel×Height×Width Batch×Channel×Height×WidthBatch×Channel×Height×Width
例如:
torch.zeros((32,3,224,224))表示:
32张图片
3个颜色通道
224×224像素
3. 创建Tensor
3.1 使用 arange 创建连续数据
x=torch.arange(12)print(x)输出:
tensor([0,1,2,3,4,5,6,7,8,9,10,11])这里生成:
0,1,2,...,11 0,1,2,...,110,1,2,...,11
共12个元素。
4. Tensor形状 Shape
Tensor 的形状可以通过:
x.shape查看:
输出:
torch.Size([12])表示:
这是一个长度为12的一维向量。
5. Tensor元素数量
使用:
x.numel()输出:
12numel:
number of elements
表示:
Tensor中元素总数量。
6. Tensor改变形状 reshape
深度学习中经常需要调整数据维度。
例如:
原始:
[0,1,2,3,4,5,6,7,8,9,10,11]转换为:
3行4列矩阵:
X=x.reshape(3,4)print(X)结果:
tensor([ [0,1,2,3], [4,5,6,7], [8,9,10,11] ])注意:
reshape不会改变数据:
只是改变观察方式。
7. 自动推断维度 -1
例如:
x.reshape(-1,4)PyTorch 会自动计算:
第一维是多少。
因为:
$ 12 \div 4=3 $
所以:
(3,4)等价于:
x.reshape(3,4)8. 创建特殊Tensor
8.1 全零矩阵
torch.zeros((2,3,4))表示:
2个矩阵
每个矩阵:
3行4列
结果:
[ [ [0,0,0,0], [0,0,0,0], [0,0,0,0] ], [ ... ] ]8.2 全1矩阵
torch.ones((2,3,4))所有元素:
xi=1 x_i=1xi=1
9. 随机初始化Tensor
神经网络参数通常需要随机初始化。
例如:
生成:
N(0,1) N(0,1)N(0,1)
即:
均值0
标准差1
代码:
torch.randn(3,4)输出类似:
[ [-0.13,0.22,...], [1.32,-0.5,...] ]为什么需要随机初始化?
因为如果所有神经元参数相同:
- 梯度相同
- 学习能力下降
所以需要随机打破对称性。
10. Tensor数学运算
PyTorch支持:
- 加法 +
- 减法 -
- 乘法 *
- 除法 /
- 幂运算 **
例如:
x=torch.tensor([1.,2,4,8])y=torch.tensor([2.,2,2,2])print(x+y)print(x-y)print(x*y)print(x/y)print(x**y)结果:
加法:
[3,4,6,10] [3,4,6,10][3,4,6,10]
乘法:
[2,4,8,16] [2,4,8,16][2,4,8,16]
11. 指数函数
torch.exp(x)计算:
ex e^xex
例如:
e1=2.718 e^1=2.718e1=2.718
在深度学习中:
Softmax:
softmax(xi)=exi∑exj softmax(x_i)= \frac{e^{x_i}} {\sum e^{x_j}}softmax(xi)=∑exjexi
就使用指数函数。
12. Tensor拼接 concat
多个Tensor合并:
torch.cat()例如:
两个矩阵:
X=torch.arange(12).reshape(3,4)Y=torch.ones((3,4))按行拼接:
torch.cat((X,Y),dim=0)结果:
形状:
(6,4) (6,4)(6,4)
按列拼接:
torch.cat((X,Y),dim=1)结果:
(3,8) (3,8)(3,8)
13. Tensor比较运算
例如:
X==Y返回:
布尔矩阵:
True False常用于:
- 判断预测是否正确
- 创建mask
14. Tensor求和
X.sum()例如:
0+1+2+...+11=66 0+1+2+...+11=660+1+2+...+11=66
输出:
tensor(66.)15. Tensor广播机制 Broadcasting
这是PyTorch非常重要的功能。
例如:
a=torch.arange(3).reshape(3,1)b=torch.arange(2).reshape(1,2)a:
[ [0], [1], [2] ]b:
[ [0,1] ]两个形状不同:
(3,1) (1,2)但是:
a+bPyTorch自动扩展:
a:
0 0 1 1 2 2b:
0 1 0 1 0 1结果:
[ [0,1], [1,2], [2,3] ]这就是:
广播机制
16. Tensor索引和切片
类似Python列表。
获取最后一行
X[-1]获取第2~3行
X[1:3]修改元素
X[1,2]=9表示:
第2行
第3列
修改整行
X[0:2,:]=12表示:
前两行全部设置为12。
17. 节省Tensor内存
普通操作:
Y=Y+X会:
- 创建新的Tensor
- 修改Y引用
因此:
内存增加。
使用:
Y[:]=X+Y可以:
原地修改。
也可以:
X+=Y减少内存开销。
18. Tensor与NumPy转换
PyTorch:
TensorNumPy:
ndarray二者可以互相转换。
Tensor → NumPy
A=X.numpy()NumPy → Tensor
B=torch.tensor(A)19. Tensor转换Python数字
如果Tensor只有一个元素:
a=torch.tensor([3.5])转换:
a.item()结果:
3.5也可以:
float(a)int(a)总结
本节学习了PyTorch最核心的数据结构:
Tensor
掌握:
| 功能 | 方法 |
|---|---|
| 创建Tensor | torch.tensor |
| 生成连续数字 | torch.arange |
| 查看形状 | shape |
| 元素数量 | numel |
| 改变维度 | reshape |
| 全0 | zeros |
| 全1 | ones |
| 随机初始化 | randn |
| 拼接 | cat |
| 求和 | sum |
| 索引 | [] |
| 广播 | broadcasting |
| NumPy转换 | numpy() |
深度学习核心思想
神经网络本质上就是:
输入数据→Tensor→矩阵运算→Tensor→预测结果 输入数据 \rightarrow Tensor \rightarrow 矩阵运算 \rightarrow Tensor \rightarrow 预测结果输入数据→Tensor→矩阵运算→Tensor→预测结果
因此:
掌握 Tensor,是学习 PyTorch 和深度学习的第一步。
