在本教程中,您将使用PyTorch框架来介绍深度学习,并且根据其结论,您可以轻松地将其应用到您的深度学习模型中。脸谱网今年早些时候推出了Py火炬1,整合了谷歌云、AWS和Azure机器学习。在本教程中,我假设您熟悉SCIKIT学习,熊猫,NUMPY和SICPY。这些包是本教程的重要先决条件。
什么是深度学习?
深度学习是机器学习的一个分支,它的算法是由人脑的工作所启发的。这些算法被称为人工神经网络。这些神经网络的例子包括用于图像分类的卷积神经网络、人工神经网络和循环神经网络。
PyTorch简介
PyTorch是一个基于Torch的Python机器学习包,它是一个基于编程语言Lua的开源机器学习包。Py火炬有两个主要特点:
具有强大的GPU加速度的张量计算(如NumPy)
自动微分建立和训练神经网络
为什么你可能更喜欢PyTorch而不是其他Python深度学习库
由于几个原因,你可能喜欢PyTrk到其他深度学习库:
与TensorFlow等其他库不同,在运行模型之前必须先定义整个计算图,PyTorch允许动态定义图。
PyTorch也非常适合深度学习研究,并提供最大的灵活性和速度。
PyTorch Tensors
PyTorch
Tensors非常类似于NUMPY阵列,可以在GPU上运行。这很重要,因为它有助于加快数值计算,这可以将神经网络的速度提高50倍或更多。要使用PyTrk,您需要转到HTTPS://PyTrCH.Or//安装PyTorch。如果使用Conda,可以通过运行这个简单命令来安装PyTrink:
conda install PyTorch torchvision -c PyTorch
为了定义Py火炬张量,我们首先导入火炬包。PyTr火炬允许你定义两种张量——CPU和GPU张量。对于本教程,我假设你正在运行一个CPU机器,但我也会告诉你如何定义GPU中的张量:
import torch
PyTrink的默认张量类型是浮点张量,定义为Tro.FuxActhor。例如,您将从Python列表创建张量:
torch.FloatTensor([[20, 30, 40], [90, 60, 70]])
如果您使用支持GPU的计算机,则可以定义张量。Python代码如下:
torch.cuda.FloatTensor([[20, 30, 40], [90, 60, 70]])
你也可以使用Py火炬张量来进行数学计算,例如加减法:
x = torch.FloatTensor([25]) y = torch.FloatTensor([30]) x + y
还可以定义矩阵并执行矩阵运算。让我们看看如何定义矩阵并转置它。
matrix = torch.randn(4, 5) matrix matrix.t()
PyTorch Autograd
PyTr火炬使用一种称为自动微分的技术,用于数值评估函数的导数。神经网络中的自动微分计算反向传递。在训练神经网络时,权值被随机初始化为零,但不是零。向后通过是从右到左调整这些权重的过程,而前向是反向的(从左到右)。
AutoGad是PyTorch的一个自动化微型图书馆。这个包的核心类是Tr..TunSur.要跟踪它上的所有操作,SET。要计算梯度,调用。这个张量的梯度将被累加在GRAD属性中。
如果要从计算历史中分离张量,请调用.Lead CH()函数。这也将防止张量的未来计算。防止历史追踪的另一种方法是使用火炬。
张量类和函数类是相互连接的,以建立一个非循环图,该图编码计算的完整历史。张量的Goothfn性质指的是创建张量的函数。要计算梯度,调用。如果张量包含多个元素并指定梯度,则它是形状匹配张量。
例如,您将创建两个张量,一个使用AddieStRADAD为真,另一个为假。然后,您将使用这两个张量执行加法和求和运算。然后,计算一张量的梯度。
a
= torch.tensor([3.0, 2.0], requires_grad=True) b = torch.tensor([4.0,
7.0]) ab_sum = a + b ab_sum ab_res = (ab_sum*8).sum() ab_res.backward()
ab_res a.grad
在格拉德上,B不会返回任何东西,因为你没有设置Read Grad对它的真实性。
PyTorch nn模块
这是一个在PyTorch构建神经网络的模块。神经网络依赖于AutoCAD定义模型,并对它们进行区分。让我们从定义神经网络训练的过程开始:
使用一些可学习的参数定义神经网络,称为权重。
迭代输入数据集。
通过网络处理输入。
将预测结果与实际值进行比较并测量误差。
将梯度传播回网络的参数中。
使用简单的更新规则更新网络权重:
重量=重量学习速率梯度
现在,您将使用神经网络包创建一个两层神经网络:
N,
D_in, H, D_out = 64, 1000, 100, 10 x = torch.randn(N, D_in) y =
torch.randn(N, D_out) model = torch.nn.Sequential( torch.nn.Linear(D_in,
H), torch.nn.ReLU(), torch.nn.Linear(H, D_out), ) loss_fn =
torch.nn.MSELoss() learning_rate = 1e-4
让我们解释一下上面使用的一些参数:
N是批量大小。批量大小是在观察数量之后更新权重。
D_in 是输入维度
H 是隐藏的维度
D_out 是输出维度
torch.randn 定义指定尺寸的矩阵
torch.nn.Sequential 初初始化层的线性堆栈
torch.nn.Linear 对输入数据应用线性变换
torch.nn.ReLU 按元素应用relu函数
torch.nn.MSELoss 创建一个衡量输入x和目标y中n个元素之间的均方误差的标准
PyTorch optim Package
接下来,您将使用OpTIM包定义一个为您更新权重的优化器。optim包抽象了优化算法的思想,并提供了常用优化算法的实现,如AdaGrad、RMSProp和Adam。我们将使用亚当优化器,它是最流行的优化器之一。
这个优化器使用的第一个参数是张量,它应该被更新。在前向传递中,你将通过将X传递给模型来计算预测的y。之后,计算和打印损失。在运行反向传递之前,使用优化器更新的变量的所有梯度设置为零。当调用.Read()不重写渐变时,默认情况下完成此操作。然后,调用优化器上的步长函数,并更新其参数。Python实现如下所示。
optimizer
= torch.optim.Adam(model.parameters(), lr=learning_rate) for t in
range(500): y_pred = model(x) loss = loss_fn(y_pred, y) print(t,
loss.item()) optimizer.zero_grad() loss.backward() optimizer.step()
PyTorch中的自定义nn模块
有时需要建立自己的自定义模块。在这些情况下,将继承子类nn.Mead。然后,您需要定义一个将接收输入张量并生成输出张量的前向。下面介绍如何使用NN模块实现两层网络。这个模型非常类似于上面的模型,但是不同的是你会使用火炬。神经网络。模块创建一个神经网络。另一个区别是使用随机梯度下降优化器代替亚当。您可以实现自定义NN模块,如下所示:
import
torch class TwoLayerNet(torch.nn.Module): def __init__(self, D_in, H,
D_out): super(TwoLayerNet, self).__init__() self.linear1 =
torch.nn.Linear(D_in, H) self.linear2 = torch.nn.Linear(H, D_out) def
forward(self, x): h_relu = self.linear1(x).clamp(min=0) y_pred =
self.linear2(h_relu) return y_pred N, D_in, H, D_out = 64, 1000, 100,
10 x = torch.randn(N, D_in) y = torch.randn(N, D_out) model =
TwoLayerNet(D_in, H, D_out) criterion = torch.nn.MSELoss() optimizer =
torch.optim.SGD(model.parameters(), lr=1e-4) for t in range(500):
y_pred = model(x) loss = criterion(y_pred, y) print(t, loss.item())
optimizer.zero_grad() loss.backward() optimizer.step()
最后
PyTr火炬允许您实现不同类型的层,例如卷层、环层和线性层。