PyTorch-深度学习简介 2018-10-07

在本教程中,您将使用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火炬允许您实现不同类型的层,例如卷层、环层和线性层。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容