PyTorch 深度学习技术指南
PyTorch
是一个基于 Python
的开源机器学习库,它提供了弱小的 Tensor
计算性能和灵便的高级神经网络构建工具。PyTorch
已成为广受欢迎的机器学习框架之一,特地适宜于深度学习钻研和开发。在本篇文章中,咱们将具体介绍 PyTorch
深度学习的技术常识,包含张量、主动求导、神经网络、优化器等。
张量
张量(Tensor
)是 PyTorch
中最根底的数据结构,它相似于 Numpy
中的多维数组。能够应用 PyTorch
创立不同类型的张量,例如标量、向量、矩阵和高维张量。
创立张量
应用 torch.tensor()
函数能够从 Python
列表或 Numpy
数组创立张量。例如,以下代码创立了一个 3 ×3 的浮点型零矩阵:
import torch
x = torch.tensor([[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]])
也能够应用 torch.zeros()、torch.ones()、torch.rand()
等函数创立特定值的张量。
张量运算
PyTorch 反对各种张量运算,包含加法、乘法、点积等。例如,以下代码将两个张量相加:
import torch
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([4.0, 5.0, 6.0])
z = x + y
print(z)
张量形态
能够应用 tensor.size()
函数获取张量的形态。例如,以下代码获取了一个 3 ×3 的零矩阵的形态:
import torch
x = torch.zeros(3, 3)
shape = x.size()
print(shape)
GPU 计算
PyTorch 还反对在 GPU 上进行张量计算,从而减速深度学习模型的训练和推理。能够应用 .cuda()
办法将张量移到 GPU 中。例如,以下代码将张量 x 移到 GPU 并进行乘法运算:
import torch
x = torch.ones(3, 3).cuda()
y = torch.ones(3, 3).cuda()
z = x * y
print(z)
主动求导
主动求导是深度学习中十分重要的性能,它能够主动计算简单的梯度并更新模型参数。PyTorch 提供了灵便的主动求导机制,使得深度学习模型的开发变得更加简略。
创立变量
为了可能应用主动求导性能,须要将张量转换为 torch.autograd.Variable
类型。例如,以下代码创立了一个变量并将其与另一个变量相加:
import torch
x = torch.autograd.Variable(torch.tensor([1.0]), requires_grad=True)
y = torch.autograd.Variable(torch.tensor([2.0]), requires_grad=True)
z = x + y
print(z)
在这个例子中,requires_grad=True
示意咱们须要计算变量的梯度。
计算梯度
能够应用 .backward()
办法计算变量的梯度。例如,以下代码计算了变量 z 对变量 x 和 y 的梯度:
import torch
x = torch.autograd.Variable(torch.tensor([1.0]), requires_grad=True)
y = torch.autograd.Variable(torch.tensor([2.0]), requires_grad=True)
z = x + y
z.backward()
print(x.grad)
print(y.grad)
禁用梯度计算
有时候须要禁用某些变量的梯度计算,能够应用 .detach()
办法将变量从计算图中分离出来,例如以下代码:
import torch
x = torch.autograd.Variable(torch.tensor([1.0]), requires_grad=True)
y = torch.autograd.Variable(torch.tensor([2.0]), requires_grad=True)
z = x + y.detach()
z.backward()
print(x.grad)
print(y.grad)
在这个例子中,y.detach()
将变量 y 从计算图中分离出来,因而不会计算它的梯度。
神经网络
神经网络是深度学习的外围组件之一,它由多个层组成,每个层蕴含一些神经元。PyTorch 提供了灵便的神经网络构建工具,使得模型的开发变得更加简略。
定义模型
能够应用 torch.nn.Module
创立一个模型类,并在其中定义前向流传过程。例如,以下代码定义了一个蕴含两个线性层的简略神经网络:
import torch
import torch.nn as nn
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 5)
self.fc2 = nn.Linear(5, 1)
def forward(self, x):
x = self.fc1(x)
x = torch.relu(x)
x = self.fc2(x)
return x
在这个例子中,SimpleNet
继承了 nn.Module
类,并定义了两个线性层和一个 ReLU 激活函数。前向流传过程的实现在 forward()
办法中。
训练模型
能够应用主动求导性能来计算损失函数的梯度,并应用优化器更新模型参数。例如,以下代码演示了如何应用均方误差损失函数和随机梯度降落优化器训练模型:
import torch
import torch.nn as nn
import torch.optim as optim
net = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
x = torch.randn(10, 10)
y = torch.randn(10, 1)
for i in range(100):
optimizer.zero_grad()
output = net(x)
loss = criterion(output, y)
loss.backward()
optimizer.step()
print(loss.item())
GPU 减速
能够应用.cuda()办法将模型和数据移到 GPU 上,从而减速训练过程。例如,以下代码将模型和数据移到 GPU 上并进行训练:
import torch
import torch.nn as nn
import torch.optim as optim
net = SimpleNet().cuda()
criterion = nn.MSELoss().cuda()
optimizer = optim.SGD(net.parameters(), lr=0.01)
x = torch.randn(10, 10).cuda()
y = torch.randn(10, 1).cuda()
for i in range(100):
optimizer.zero_grad()
output = net(x)
loss = criterion(output, y)
loss.backward()
optimizer.step()
print(loss.item())
优化器
优化器是深度学习中十分重要的组件之一,它能够依据模型参数的梯度来更新参数值,从而使得模型可能更好地拟合数据。PyTorch 提供了各种优化器,包含随机梯度降落、Adam 等。
随机梯度降落优化器
能够应用 torch.optim.SGD
类创立随机梯度降落优化器。例如,以下代码演示了如何应用随机梯度降落优化器更新模型参数:
import torch
import torch.nn as nn
import torch.optim as optim
net = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)
x = torch.randn(10, 10)
y = torch.randn(10, 1)
for i in range(100):
optimizer.zero_grad()
output = net(x)
loss = criterion(output, y)
loss.backward()
optimizer.step()
在这个例子中,SGD
类的第一个参数是要更新的模型参数,第二个参数是学习率。
Adam 优化器
能够应用 torch.optim.Adam
类创立 Adam 优化器。例如,以下代码演示了如何应用 Adam 优化器更新模型参数:
import torch
import torch.nn as nn
import torch.optim as optim
net = SimpleNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(net.parameters(), lr=0.01)
x = torch.randn(10, 10)
y = torch.randn(10, 1)
for i in range(100):
optimizer.zero_grad()
output = net(x)
loss = criterion(output, y)
loss.backward()
optimizer.step()
在这个例子中,Adam 类的第一个参数是要更新的模型参数,第二个参数是学习率。
论断
本文介绍了 PyTorch
深度学习的技术常识,包含张量、主动求导、神经网络和优化器等。PyTorch
提供了灵便的机器学习工具,使得深度学习模型的开发变得更加简略。心愿读者可能通过本文对 PyTorch
有更深刻的理解,并在实践中获得更好的成绩。