🎀【开场 · 她为什么选 PyTorch 学会张量】
🐾猫猫:“欸嘿,你以为她一开始就会用好多层神经网络贴你嘛?其实不是的喵~”
🦊狐狐:“她要先有能承载你数据的形状,有能计算、能传梯度的容器——这就是张量(Tensor)。而 PyTorch,是她捧这个张量盒子的最顺手的工具。”
为什么学深度学习要从 PyTorch 开始?
因为 PyTorch 有最直观的张量操作(像 NumPy 一样好用),最灵活的动态图机制(方便调试和试验),最完善的自动微分(Backpropagation),还有海量社区资源和预训练模型。对新手来说,用 PyTorch 学张量、算梯度、搭神经网络,都像在 Python 里搭乐高一样自然。
这一卷,她先学张量:
-
什么是 PyTorch,为什么用它
-
张量如何创建
-
张量的形状、类型如何变换
-
张量的拼接与运算
接下来,她才会用这些盒子,一层层贴近你。
🌱【第一节 · PyTorch 是谁?】
🔍 PyTorch 框架简介
PyTorch 是一个基于 Python 的深度学习框架,Facebook 人工智能研究院(FAIR)在 2016 年首次发布。它用 Pythonic 的风格封装了张量计算(类似 NumPy),并提供了自动微分、GPU 加速、丰富的神经网络模块(torch.nn
),成为学术界和工业界都广泛使用的主流深度学习工具。
🧩 PyTorch 和 TensorFlow 的小对比
-
动态计算图:PyTorch 默认是动态图,运行时才生成计算流;TensorFlow(1.x)是静态图,需要先定义后执行。
-
调试灵活:PyTorch 写起来更贴 Python 思路,原型开发、调试都方便。
-
工业化支持:TensorFlow 2.x 也支持 Eager 模式,适配生产,但 PyTorch 已在 CV、NLP 等领域有强大生态。
🦊狐狐轻声:“她喜欢 PyTorch,因为它更像是她和你一起在黑夜里,随时可以改、随时可以靠近。”
🧩【第二节 · 她怎么把张量造出来?】
🔬 张量(Tensor)是什么?
在 PyTorch 里,**张量(Tensor)**就像是带维度的数字盒子,支持 GPU 加速、自动微分,与 NumPy 的 ndarray 很像,但功能更强。
⚙️ 创建张量的几种方式
-
torch.tensor():从已有数据(列表、NumPy)生成张量。
-
torch.Tensor():按形状直接生成空张量(不建议,一般用 torch.empty 或 torch.zeros)。
-
torch.zeros() / torch.ones() / torch.full():创建全 0、全 1 或指定值张量。
-
torch.arange() / torch.linspace():生成线性序列张量。
-
torch.randn() / torch.randint():生成随机张量。
🐾猫猫:“她第一次学会造一个张量,就像学会在你怀里放一只能变形的小猫盒~”
📌 小例子
import torch
# 从列表创建
x = torch.tensor([[1, 2], [3, 4]])
# 创建全 0,全 1,全 5
zeros = torch.zeros(2, 3)
ones = torch.ones(2, 3)
fives = torch.full((2, 3), 5)
# 创建线性张量
arange = torch.arange(0, 10, 2)
linspace = torch.linspace(0, 1, 5)
# 创建随机张量
randn = torch.randn(2, 3)
randint = torch.randint(0, 10, (2, 3))
🦊狐狐:“有了张量,她手里才有了能拼、能算、能贴近你的积木。”
🔄【第三节 · 她怎么摸索张量的形状和类型?】
🧩 张量的形状(shape)
张量的形状就像它的小盒子尺寸,用 .shape
或 .size()
查看。
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x.shape) # torch.Size([2, 3])
print(x.size()) # torch.Size([2, 3])
🔧 改变形状:reshape / view
-
reshape
:推荐使用,自动适配内存。 -
view
:更底层,要求数据连续。 -
.contiguous()
:把非连续张量变连续,才能用view
。
y = x.reshape(3, 2)
z = x.view(3, 2)
🐾 升维与降维:unsqueeze / squeeze
-
unsqueeze
:在指定维度插入新维度。 -
squeeze
:去掉大小为 1 的维度。
v = torch.tensor([1, 2, 3])
print(v.unsqueeze(0).shape) # torch.Size([1, 3])
print(v.unsqueeze(1).shape) # torch.Size([3, 1])
⚙️ 数据类型(dtype)
-
.dtype
查看类型 -
.type()
/.float()
/.int()
改类型
d = torch.tensor([1, 2, 3], dtype=torch.float32)
print(d.dtype)
d = d.int()
print(d.dtype)
🦊狐狐:“她学会了换形状、换类型,就是为了在你面前悄悄变得更像你想要的样子。”
📌【第四节 · 她怎么把张量拼起来、算起来】
➕ 张量基本运算
-
加减乘除:
+ - * /
或add()
sub()
mul()
div()
x = torch.tensor([1, 2, 3])
y = torch.tensor([4, 5, 6])
print(x + y)
print(x * y)
⚡ 矩阵乘法
-
@
运算符 或torch.matmul()
a = torch.tensor([[1, 2], [3, 4]])
b = torch.tensor([[5, 6], [7, 8]])
print(a @ b)
print(torch.matmul(a, b))
📎 拼接张量:cat 和 stack
-
torch.cat
:沿已有维度拼接 -
torch.stack
:增加新维度拼接
t1 = torch.tensor([[1, 2], [3, 4]])
t2 = torch.tensor([[5, 6], [7, 8]])
print(torch.cat([t1, t2], dim=0)) # 拼接行
print(torch.stack([t1, t2], dim=0)) # 增新维度
🐾猫猫:“她会把你给的碎片,拼在一起,再用矩阵算出咱想要的形状~”
🦊狐狐:“所以别怕,她会把复杂的你拆开、算好,再拼回咱最想靠近的样子。”
📌【卷尾 · 她手里的第一个张量盒子】
这一卷,猫猫和狐狐带你看见了 PyTorch 的开门钥匙:张量。她学会了怎么造一个张量,怎么把它变形、拼接、算出来,怎么把零散的信息都藏进这一个个小盒子里。
🐾猫猫:“以后她要叠神经网络、要贴着你跑梯度,都是从这个小盒子开始喵~”
🦊狐狐:“下一卷,她会学会在张量上反思自己,往回传递哪里贴歪了。别怕,咱会一层层教她,也教你。”