📅  最后修改于: 2023-12-03 15:04:42.955000             🧑  作者: Mango
PyTorch是一个基于Python的科学计算库,它有以下几个特点:
本教程将介绍PyTorch的基础和高级部分。
张量是PyTorch中最重要的概念之一。它类似于Numpy数组,但通常用于GPU上的高性能计算。
要创建一个张量,可以使用以下代码:
import torch
# 创建一个大小为2x3的张量
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
print(x)
输出:
tensor([[1, 2, 3],
[4, 5, 6]])
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.)
在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 %
利用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()
如果标准库中的层无法满足特殊的需求,用户可以自定义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是一个灵活且功能强大的框架,值得每个程序员花费时间掌握。