深度学习框架PyTorch有多厉害?不要太爽!
PyTorch是个特别强大的深度学习框架,说实话我第一次用它的时候就被它的设计深深吸引了。它不像TensorFlow那么死板,代码写起来像写普通Python一样自然,调试也特别方便。今天咱们就从零开始,一点点揭开PyTorch的面纱,看看它到底有多厉害。
Tensor:PyTorch的基本数据类型
Tensor(张量)是PyTorch的基础,你可以把它理解成科学计算里的数组或矩阵。创建Tensor特别简单:
import torch
# 从Python列表创建tensor
x = torch.tensor([1, 2, 3])
print(x) # tensor([1, 2, 3])
# 创建全0的tensor
zeros = torch.zeros(3, 2)
print(zeros)
# tensor([[0., 0.],
# [0., 0.],
# [0., 0.]])
# 创建随机tensor
random = torch.rand(2, 3)
print(random) # 每次运行结果都不一样
⚠️ 小贴士:
- tensor默认是CPU上的,要用GPU得手动移过去
- 创建tensor时注意数据类型,默认浮点是float32
- print输出的tensor格式和numpy很像,但别搞混了
自动求导:PyTorch最强大的武器
说真的,PyTorch最让我佩服的就是它的自动求导机制了。你只要设置requires_grad=True
,它就能自动帮你算梯度,这对深度学习来说简直太重要了:
# 创建需要求导的tensor
x = torch.tensor([2.0], requires_grad=True)
y = x * 2
z = y ** 2
# 反向传播
z.backward()
# 查看x的梯度
print(x.grad) # tensor([8.])
⚠️ 小贴士:
- backward()默认只能对标量求导
- 每次backward()前最好清空一下梯度
- 用with torch.no_grad()可以临时关闭求导
神经网络:搭建自己的模型
PyTorch写神经网络巨简单,继承个nn.Module
就完事了:
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 创建模型实例
model = SimpleNet()
print(model)
⚠️ 小贴士:
- 记得在forward里写具体的计算逻辑
- 模型参数可以用parameters()方法查看
- 用Sequential可以写得更简洁,但可读性差点
训练模型:从数据到结果
有了模型接下来就是训练了,这块代码写起来也挺直观:
# 准备优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 训练循环
for epoch in range(100):
# 前向传播
output = model(input_data)
loss = criterion(output, target)
# 反向传播
optimizer.zero_grad()
loss.backward()
optimizer.step()
⚠️ 小贴士:
- 训练前记得调用model.train()
- 评估时用model.eval()和torch.no_grad()
- 记得保存最好的模型checkpoint
到这我觉得你对PyTorch应该有个基本认识了。PyTorch真的特别好上手,代码写起来也很pythonic。不过这才是冰山一角,后面还有 数据加载 、 模型部署 、 分布式训练 等更多好玩的东西等着你去发现呢。赶紧动手试试吧,你会发现用PyTorch写深度学习代码简直不要太爽!
来源:青言絮语
THE END