Skip to content

Latest commit

 

History

History
223 lines (147 loc) · 6.73 KB

a-beginners-guide-to-pytorch.md

File metadata and controls

223 lines (147 loc) · 6.73 KB

PyTorch 初学者指南

原文:www.kdnuggets.com/a-beginners-guide-to-pytorch

PyTorch 初学者指南

图片来源:编辑 | Midjourney & Canva

深度学习在人工智能研究的许多领域被广泛使用,并且促进了技术进步。例如,文本生成、面部识别和语音合成应用都基于深度学习研究。


我们的前三个课程推荐

1. 谷歌网络安全证书 - 快速进入网络安全职业道路。

2. 谷歌数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持你所在组织的 IT


最常用的深度学习包之一是PyTorch。它是由 Meta AI 于 2016 年创建的开源包,并且被许多人使用。

PyTorch 有很多优点,包括:

  • 灵活的模型架构

  • 对 CUDA 的原生支持(可以使用 GPU)

  • 基于 Python

  • 提供低级别的控制,这对于研究和许多用例非常有用

  • 开发者和社区的积极开发

让我们通过这篇文章探索 PyTorch,帮助你入门。

准备工作

你应该访问他们的安装网页,选择适合你环境要求的版本。下面的代码是安装示例。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

PyTorch 准备好了,让我们进入核心部分。

PyTorch 张量

张量是 PyTorch 中的基本构件。它类似于 NumPy 数组,但可以使用 GPU。我们可以使用以下代码尝试创建一个 PyTorch 张量:

a = torch.tensor([2, 4, 5])
print(a)
Output>> 
tensor([2, 4, 5])

像 NumPy 数组张量一样,它允许矩阵运算。

e = torch.tensor([[1, 2, 3],
                [4, 5, 6]])
f = torch.tensor([7, 8, 9])

print(e * f)
Output>>
tensor([[ 7, 16, 27],
        [28, 40, 54]])

也可以执行矩阵乘法。

g = torch.randn(2, 3)
h = torch.randn(3, 2)
print( g @ h)
Output>> 
tensor([[-0.8357,  0.0583],
        [-2.7121,  2.1980]])

我们可以使用下面的代码访问张量信息。

x = torch.rand(3,4)

print("Shape:", x.shape)
print("Data type:", x.dtype)
print("Device:", x.device)
Output>>
Shape: torch.Size([3, 4])
Data type: torch.float32
Device: cpu

PyTorch 的神经网络训练

通过使用 nn.Module 类定义神经网络,我们可以开发一个简单的模型。让我们试试下面的代码。

import torch

class SimpleNet(nn.Module):
    def __init__(self, input, hidden, output):
        super(SimpleNet, self).__init__()
        self.fc1 = torch.nn.Linear(input, hidden)
        self.fc2 = torch.nn.Linear(hidden, output)

    def forward(self, x):
        x = torch.nn.functional.relu(self.fc1(x))
        x = self.fc2(x)
        return x

inp = 10
hid = 10
outp = 2
model = SimpleNet(inp, hid, out)

print(model)
Output>>
SimpleNet(
  (fc1): Linear(in_features=10, out_features=10, bias=True)
  (fc2): Linear(in_features=10, out_features=2, bias=True)
)

上面的代码定义了一个SimpleNet类,继承自nn.Module,用于设置层。我们使用nn.Linear作为层,relu作为激活函数。

我们可以添加更多层或使用不同的层,如 Conv2D 或 CNN。但我们不会使用这些。

接下来,我们将用样本张量数据训练我们开发的SimpleNet

import torch

inp = torch.randn(100, 10) 
tar = torch.randint(0, 2, (100,)) 
criterion = torch.nn.CrossEntropyLoss()
optimizr = torch.optim.SGD(model.parameters(), lr=0.01)

epochs = 100
batchsize = 10

for epoch in range(numepochs):
    model.train()

    for i in range(0, inp.size(0), batchsize):
        batch_inp = inputs[i:i+batch_size]
        batch_tar = targets[i:i+batch_size]

        out = model(batch_inp)
        loss = criterion(out, batch_tar)

        optimizer.zero_grad()
        loss.backward()
        optimizr.step()

    if (epoch + 1) % 10 == 0:
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {round(loss.item(),4})')

在上述训练过程中,我们使用随机张量数据,并初始化一个称为CrossEntropyLoss的损失函数。同时,我们初始化 SGD 优化器来管理模型参数以最小化损失。

训练过程根据周期次数多次运行,然后进行优化过程。这是通常的深度学习流程。

我们可以添加几个步骤以提高训练的复杂性,例如早停、学习率和其他技术。

最后,我们可以使用未见过的数据评估我们训练的模型。以下代码允许我们做到这一点。

from sklearn.metrics import classification_report

model.eval()
test_inputs = torch.randn(20, 10)
test_targets = torch.randint(0, 2, (20,))

with torch.no_grad():
    test_outputs = model(test_inputs)
    _, predicted = torch.max(test_outputs, 1)

print(classification_report(test_targets, predicted))

上述情况发生的原因是我们将模型切换到评估模式,这会关闭 dropout 和批量归一化更新。此外,我们还禁用梯度计算过程以加快处理速度。

你可以访问 PyTorch 文档 以进一步了解你可以做什么。

结论

在本文中,我们将深入探讨 PyTorch 的基础知识。从张量创建到张量操作,再到开发一个简单的神经网络模型。本文为初学者级别,所有新手应能迅速跟上。

Cornellius Yudha Wijaya**** 是一位数据科学助理经理和数据撰稿人。在全职工作于 Allianz Indonesia 的同时,他喜欢通过社交媒体和写作媒体分享 Python 和数据技巧。Cornellius 涉及多种 AI 和机器学习主题的写作。

更多相关主题