Pytorch深度学习入门与实战

PyTorch是深度学习的主流框架之一,新手入门相对容易。课程将算法、模型和基础理论知识进行有机结合,结合多个不同的CV与NLP实战项目,帮助大家掌握PyTorch框架的基础知识和使用方法,带大家较平稳地入门深度学习领域。我的图书馆留言交流

Python被确定为数据科学和机器学习的进入语言,部分感谢开源ML库Pytorch。

Pytorch的功能强大的深度神经网络建筑工具和易用性使其成为数据科学家的热门选择。随着其人气的发展,越来越多的公司正在从Tensorflow转移到Pytorch,现在开始使用Pytorch的最佳时间。

今天,我们将帮助了解Pytorch如此流行的是什么,使用Pytorch的一些基础,并帮助您制作第一个计算模型。

这是我们今天的封面:

  • 什么是pytorch?
  • 为什么要使用pytorch?
  • pytorch基础知识
  • 使用pytorch计算图表
  • 与Pytorch的实践:多路径计算图
  • 你学习的下一步

什么是pytorch?

PyTorch是一个开源机器学习Python库,用于深度学习实现,如计算机视觉(使用武器)和自然语言处理。它是由Facebook的AI Research Lab(Fair)于2016年开发的,自数据科学和ML领域以来已采用。

Pytorch为已经熟悉Python的人提供了直观的机器,并且具有oop支持和动态计算图等具有很大的功能。

除了构建深度神经网络之外,由于其GPU加速,Pytorch也非常适合复杂的数学计算。此功能允许Pytorch使用计算机的GPU来大量加速计算。

这种独特的功能和Pytorch的无与伦比的简单的组合使其成为最受欢迎的深度学习库之一,只有顶点的Tensorflow竞争。

为什么要使用pytorch?

在Pytorch之前,开发人员使用高级微积分来查找反向传播错误和节点加权之间的关系。更深的神经网络呼吁越来越复杂的操作,限制机器学习的规模和易在性。

现在,我们可以使用ML图书馆自动完成所有的微积分!ML库可以在几秒钟内计算任何大小或形状网络,允许更多开发人员构建更大和更好的网络。

Pytorch通过表现类似于标准Python来进一步逐步迈出此访问。您可以使用现有的Python知识来快速开始启动现有的Python知识而不是学习新的语法。此外,您可以使用Pytorch使用额外的Python库,例如Pycharm调试器等流行调试器。

pytorch与tensorflow.

Pytorch和Tensorflow之间的主要区别是简单和性能之间的权衡:Pytorch更容易学习(特别是对于Python程序员),而Tensorflow具有学习曲线,但执行更好并且更广泛地使用。

  • 人气:Tensorflow是行业专业人士和研究人员的当前转向工具,因为它比Pytorch较早发布了1年。然而,Pytorch用户的速度比Tensorflow更快,表明Pytorch可能很快是最受欢迎的。
  • 数据并行性:Pytorch包括声明性数据并行性,换句话说,它会自动将数据处理的工作量分布在不同的GPU上以加速性能。Tensorflow有并行性,但它要求您手动分配工作,这通常是耗时和更少的效率。
  • 动态与静态图表:Pytorch默认情况下具有动态图形,可立即响应新数据。Tensorflow使用TensoRFlow Fold对动态图形的支持有限,但主要使用静态图形。
  • 集成:由于其通过武器密切连接,Pytorch适用于AWS上的项目。Tensorflow与Google Cloud相结合,并且由于其使用SWIFT API而非常适合移动应用程序。
  • 可视化:Tensorflow拥有更强大的可视化工具,并提供更精细的图形设置控制。Pytorch的愿望可视化工具或类似Matplotlib的其他标准绘图库并不像Tensorflow那样完全齐全,但它们更容易学习。

pytorch基础知识

张量

Pytorch Tensors是作为所有高级操作的基础的多维阵列变量。与标准数字类型不同,可以分配张量以使用CPU或GPU加速操作。

它们与N维数量数量类似,甚至可以仅在单行中转换为Numpy数组。

张量有5种类型:

  • Floattensor:32位 Float
  • Doubletensor:64位 Float
  • HalfTensor:16位 Float
  • Intstensor:32位int
  • longtensor:64位int

与所有数字类型一样,您希望使用适合您需要保存内存的最小类型。pytorch使用floattensor作为所有张量的默认类型,但您可以使用此使用

torch.set_default_tensor_type(t)

初始化两个FloatTensors:

import torch# initializing tensorsa = torch.tensor(2)b = torch.tensor(1)

在简单的数学运算中可以像其他数字类型一样使用张量。

# additionprint(a+b)# subtractionprint(b-a)# multiplicationprint(a*b)# divisionprint(a/b)

您还可以使用移动GPU的CUDA处理张量。

if torch.cuda.is_available():    x = x.cuda()    y = y.cuda()    x + y

随着张量在Pytorch中的矩阵,您可以设置Tensors以表示数字表:

ones_tensor = torch.ones((2, 2)) # tensor containing all onesrand_tensor = torch.rand((2, 2)) # tensor containing random values

在这里,我们指定了我们的张量应该是2x2平方。在使用rand()函数时使用vone()函数或随机数时,填充了广场。

神经网络

由于其卓越的分类模型(如图像分类或卷积神经网络(CNN)),Pytorch通常用于构建神经网络。

神经网络是连接和加权数据节点的层。每个图层允许模型在其中分类输入数据最匹配的分类。

神经网络仅与他们的培训一样好,因此需要大数据集和GAN框架,这基于已经由模型掌握的那些产生更具挑战性的培训数据。

Pytorch使用Torch.NN包定义神经网络,其中包含一组模块来表示网络的每层。

每个模块接收输入张量并计算输出张力,该输出张量在一起以创建网络。Torch.nn封装还定义了我们用于训练神经网络的损耗函数。建立神经网络的步骤是:

  • 架构:创建神经网络层,设置参数,建立权重和偏见。
  • 正向传播:使用参数计算预测的输出。通过比较预测和实际输出来测量误差。
  • 反向传播:在找到错误后,在神经网络的参数方面采用错误功能的导数。向后传播允许我们更新我们的权重参数。
  • 迭代优化:使用优化器通过使用梯度下降来使用迭代更新参数的优化器来最小化错误。

这是Pytorch中神经网络的示例:

import torchimport torch.nn as nnimport torch.nn.functional as Fclass Net(nn.Module):    def __init__(self):        super(Net, self).__init__()        # 1 input image channel, 6 output channels, 3x3 square convolution        # kernel        self.conv1 = nn.Conv2d(1, 6, 3)        self.conv2 = nn.Conv2d(6, 16, 3)        # an affine operation: y = Wx + b        self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, 10)    def forward(self, x):        # Max pooling over a (2, 2) window        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))        # If the size is a square you can only specify a single number        x = F.max_pool2d(F.relu(self.conv2(x)), 2)        x = x.view(-1, self.num_flat_features(x))        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return x    def num_flat_features(self, x):        size = x.size()[1:]  # all dimensions except the batch dimension        num_features = 1        for s in size:            num_features *= s        return num_featuresnet = Net()print(net)

NN.Module指定这将是一个神经网络,然后我们用2个Conv2D层定义它,该层执行2D卷积,以及执行线性变换的3个线性层。

接下来,我们定义了向前概述转发传播的前向方法。我们不需要定义向后传播方法,因为Pytorch默认包括向后()功能。

别担心现在似乎令人困惑,我们将在本教程后面介绍更简单的Pytorch实现。

Autograd

Autograd是一个用于计算神经网络操作所必需的衍生产品的Pytorch包。这些衍生物称为梯度。在转发通行证期间,Autograd在梯度的张量上记录所有操作,并创建一个非循环图,以找到张量和所有操作之间的关系。此操作集合称为自动差异化。

该图的叶子是输入张量,根部是输出张量。Autograd通过将图形从根到叶子跟踪并将每个梯度乘以使用链规则来计算渐变来计算梯度。

在计算梯度之后,衍生物的值被自动填充为张量的grad属性。

import torch# pytorch tensorx = torch.tensor(3.5, requires_grad=True)# y is defined as a function of xy = (x-1) * (x-2) * (x-3)# work out gradientsy.backward()

默认情况下,RESCEL_GRAD设置为FALSE,PyTorch不会跟踪渐变。在初始化期间指定RESECT_GRAD为TRUE将使您在执行某些操作的情况下对该特定张量进行PYTORCH跟踪梯度。

此代码查看Y并看到它来自(x-1)(x-2)(x-3),并自动制造梯度dy / dx,3x ^ 2 - 12x + 11

该指令还解决了该梯度的数值,并将其放置在张量x内,同时x,3.5的实际值。

渐变为3 (3.5 3.5) - 12 *(3.5)+ 11 = 5.75。

> Image Source: Author

渐变默认累计,如果未重置,则可能会影响结果。使用Model.zero_grad()在每个渐变后重新归零您的图形。

优化器

优化器允许您在模型中更新权重和偏置以减少错误。这允许您编辑模型的工作原理,而无需重新制止整个事物。

所有Pytorch优化器都包含在Torch.optim包中,每个优化方案都设计用于特定情况。Torch.optim模块允许您通过刚刚传递参数列表来构建抽象优化方案。Pytorch有许多优化器可以选择,这意味着几乎总是一个最适合您的需求。

例如,我们可以实现公共优化算法,SGD(随机梯度下降),以平滑我们的数据。

import torch.optim as optimparams = torch.tensor([1.0, 0.0], requires_grad=True)learning_rate = 1e-3## SGDoptimizer = optim.SGD([params], lr=learning_rate)

更新模型后,使用优化器.step()告诉Pytorch来重新计算模型。使用优化器,我们需要使用循环手动更新模型参数:

for params in model.parameters(): params -= params.grad * learning_rate

总的来说,优化器通过允许您优化数据加权并改变模型而无需重新制定若需时间来节省大量时间。

使用pytorch计算图

为了更好地了解Pytorch和神经网络,可以使用计算图来练习。这些图形本质上是一种简化版本的神经网络,用于有一系列操作,用于了解系统的输出如何受输入的影响。

换句话说,输入x用于找到y,然后用于找到输出z。

> Image Source: Author

想象一下,Y和Z计算如下:

y = x ^ 2

z = 2Y + 3

但是,我们对输出Z如何使用Input X进行更改感兴趣,因此我们需要执行一些微积分:

dz / dx =(dz / dy)*(dy / dx)

dz / dx = 2.2x

dz / dx = 4x

使用此,我们可以看到输入x = 3.5将使z = 14。

知道如何在其他情况下定义每个张量(根据x,z的y和z,y等方面等)允许pytorch构建这些张量如何连接的图像。

> Image Source: Author

这张照片称为计算图,可以帮助我们了解Pytorch如何在幕后工作。

使用此图形,我们可以看到每个张量如何受到任何其他张量的变化的影响。这些关系是梯度,用于在训练期间更新神经网络。

这些图更容易使用Pytorch比手工操作更容易,所以我们现在试试吧,我们了解幕后发生的事情。

import torch# set up simple graph relating x, y and zx = torch.tensor(3.5, requires_grad=True)y = x*xz = 2*y + 3print('x: ', x)print('y = x*x: ', y)print('z= 2*y + 3: ', z)# work out gradientsz.backward()print('Working out gradients dz/dx')# what is gradient at x = 3.5print('Gradient at x = 3.5: ', x.grad)

这发现Z = 14就像我们用手发现的那样!

与Pytorch的实践:多路径计算图

既然你已经看到了一个具有单一关系的计算图,让我们尝试一个更复杂的例子。

首先,定义两个张量,a和b,以用作我们的输入。确保设置RESECT_GRAD = TRUE,以便我们可以将渐变缩小到下线。

import torch# set up simple graph relating x, y and za = torch.tensor(3.0, requires_grad=True)b = torch.tensor(2.0, requires_grad=True)

接下来,设置我们的输入和我们神经网络的每层之间的关系,x,y和z。请注意,z在x和y方面定义,而x和y使用我们的输入值a和b定义。

import torch# set up simple graph relating x, y and za = torch.tensor(3.0, requires_grad=True)b = torch.tensor(2.0, requires_grad=True)x = 2*a + 3*by = 5*a*a + 3*b*b*bz = 2*x + 3*y

这构建了一个关系链,Pytorch可以遵循了解数据之间的所有关系。

我们现在可以通过从z向a追随z到a的路径来解决梯度Dz / da。

有两条路径,一个通过x和另一条通过y。您应该遵循它们并将两条路径的表达式添加在一起。这是有道理的,因为来自a到z的两条路径有助于z的值。

如果我们使用Chain规则的微积分法定了DZ / DA,我们已经找到了相同的结果。

> Image Source: Author

第一路径X给我们2 * 2,第二条路径通过Y给我们3 * 10A。因此,Z随着4 + 30A而变化的速率。

如果A是22,则DZ / DA为4 + 30 * 2 = 64。

我们可以通过从z添加向后传播然后询问a的梯度(或衍生)来确认它。

import torch# set up simple graph relating x, y and za = torch.tensor(2.0, requires_grad=True)b = torch.tensor(1.0, requires_grad=True)x = 2*a + 3*by = 5*a*a + 3*b*b*bz = 2*x + 3*yprint('a: ', a)print('b: ', b)print('x: ', x)print('y: ', y)print('z: ', z)# work out gradientsz.backward()print('Working out gradient dz/da')# what is gradient at a = 2.0print('Gradient at a=2.0:', a.grad)

你学习的下一步

恭喜,您现在已完成您的快速入门,并且是Pytorch和神经网络。完成计算图形是了解深度学习网络的重要组成部分。

当您了解高级深度学习技能和应用程序时,您将想要探索:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340