📜  PyTorch教程(1)

📅  最后修改于: 2023-12-03 15:04:42.955000             🧑  作者: Mango

PyTorch教程

PyTorch是一个基于Python的科学计算库,它有以下几个特点:

  • 类似于Numpy,但是它可以使用GPU加速计算。
  • 动态计算图。
  • 拥有自动求导的机制。
  • 深度学习框架中最灵活的框架之一。

本教程将介绍PyTorch的基础和高级部分。

基础部分
张量(Tensor)

张量是PyTorch中最重要的概念之一。它类似于Numpy数组,但通常用于GPU上的高性能计算。

要创建一个张量,可以使用以下代码:

import torch

# 创建一个大小为2x3的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x)

输出:

tensor([[1, 2, 3],
        [4, 5, 6]])
自动求导(Autograd)

PyTorch的自动求导机制使得反向传播算法的实现非常容易。

一个简单的例子如下所示:

import torch

# 创建一个标量张量
x = torch.tensor(2.0, requires_grad=True)
# 创建另外一个标量张量
y = torch.tensor(3.0, requires_grad=True)

# 计算z=x*y
z = x * y

# 对x求导
z.backward()

print(x.grad)  # tensor(3.)
print(y.grad)  # tensor(2.)

输出:

tensor(3.)
tensor(2.)
神经网络(Neural Networks)

在PyTorch中构建神经网络非常容易,只需要定义网络的层以及正向传播函数即可。

下面是一个简单的例子,其中定义了一个包含单个隐藏层的全连接神经网络,并使用MNIST数据集进行训练。

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms

# 定义一个包含单个隐藏层的全连接神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.fc2 = nn.Linear(256, 10)

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

# 加载MNIST数据集
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_data = datasets.MNIST('./data', train=True, download=True, transform=transform)
test_data = datasets.MNIST('./data', train=False, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_data, batch_size=128, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_data, batch_size=128, shuffle=True)

# 初始化网络,定义损失函数和优化器
net = Net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(net.parameters(), lr=0.001)

# 进行训练
for epoch in range(10):
    for data, target in train_loader:
        optimizer.zero_grad()
        output = net(data)
        loss = criterion(output, target)
        loss.backward()
        optimizer.step()

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for data, target in test_loader:
        output = net(data)
        _, predicted = torch.max(output.data, 1)
        total += target.size(0)
        correct += (predicted == target).sum().item()

print('Accuracy: %d %%' % (100 * correct / total))

输出:

Accuracy: 97 %
高级部分
多GPU训练(Data Parallel)

利用PyTorch的Data Parallel功能,可以在多个GPU上并行训练神经网络,从而显著缩短训练时间。

下面是一个简单的例子:

import torch
import torch.nn as nn
import torch.optim as optim

# 定义一个简单的神经网络
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.fc2 = nn.Linear(5, 2)

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

# 创建一个包含多个GPU的模型
net = Net()
net_gpu = nn.DataParallel(net)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001)

# 模拟数据
inputs = torch.randn(100, 10)
targets = torch.randint(2, (100, ))

# 在GPU上进行训练
inputs_gpu = inputs.to('cuda')
targets_gpu = targets.to('cuda')
output_gpu = net_gpu(inputs_gpu)
loss_gpu = criterion(output_gpu, targets_gpu)
loss_gpu.backward()
optimizer.step()
自定义层(Custom Layers)

如果标准库中的层无法满足特殊的需求,用户可以自定义PyTorch中的层。

下面是一个简单的例子,其中定义了一个自定义层,实现了在正向传播中缩放输入张量的功能。

import torch
import torch.nn as nn

# 定义一个自定义层
class ScaleLayer(nn.Module):
    def __init__(self, size):
        super(ScaleLayer, self).__init__()
        self.scale = nn.Parameter(torch.ones(size))

    def forward(self, x):
        return x * self.scale

# 使用自定义层
layer = ScaleLayer(2)
input = torch.tensor([[1.0, 2.0], [3.0, 4.0]])
output = layer(input)

print(output)

输出:

tensor([[1., 2.],
        [3., 4.]], grad_fn=<MulBackward0>)
结论

在本教程中,我们介绍了PyTorch的基础和高级部分。PyTorch是一个灵活且功能强大的框架,值得每个程序员花费时间掌握。