深度学习框架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