PyTorch 初学者教程:所有基础知识

世界在不断发展,服务于世界的技术也在不断发展。每个人都必须跟上技术的快速变化。人工智能是发展速度最快、规模最大的领域之一。

我们正在训练机器学习,结果越来越好。有可以生成新图像的生成网络 (GAN)、用于将手语翻译成文本的深度学习模型等等!在这个快速发展的领域,PyTorch 是构建这些模型的替代方案。

考虑到了解 PyTorch 的所有优点,我们撰写了一系列关于使用 PyTorch 进行深度学习的文章——面向初学者的 Pytorch 教程。在本入门课程中,我们将介绍以下主题。

PyTorch 初学者指南
PyTorch 初学者指南:基础知识
PyTorch 初学者指南:使用预训练模型进行图像分类
在 PyTorch 中使用迁移学习进行图像分类
使用 ONNX 和 Caffe2 的 PyTorch 模型推理
PyTorch 初学者指南:使用 torchvision 进行语义分割
物体检测
实例分割

什么是 PyTorch?

PyTorch 是一个基于 Python 的库,它有助于构建深度学习模型并将其用于各种应用程序。但这不仅仅是另一个深度学习库。它是一个科学计算包(正如官方 PyTorch 文档所述)。

它是一个基于 Python 的科学计算包,针对两类受众:
1. 替代 NumPy 以利用 GPU 的功能
2. 提供最大灵活性和速度的深度学习研究平台使用 PyTorch 进行深度学习:60 分钟速成

PyTorch 使用Tensor作为其核心数据结构,类似于 Numpy 数组。您可能对这种特定的数据结构选择感到疑惑。答案在于,有了适当的软件和硬件,张量可以加速各种数学运算。当这些运算在深度学习中大量执行时,速度会有巨大的差异。

PyTorch 与 Python 类似,注重易用性,即使是编程知识非常基础的用户也可以在项目中使用深度学习。如果您还不了解深度学习库,那么 PyTorch 就是完美的“第一个要学习的深度学习库”。

图片

为什么要学习 PyTorch?– Pytorch 初学者教程

在上一节中,我们提到 PyTorch 是你应该学习的第一个深度学习库的完美选择。在本节中,我们将详细说明为什么它如此。

深度学习库并不缺乏:Keras、Tensorflow、Caffe、Theano(RIP)等等。PyTorch 有何不同?

理想的深度学习库应该易于学习和使用,足够灵活以用于各种应用程序,高效以便我们可以处理庞大的现实数据集,并且足够准确以便在输入数据存在不确定性的情况下也能提供正确的结果。

PyTorch 在上述所有指标上都表现得非常出色。“ pythonic ”编码风格使其易于学习和使用。GPU加速、对分布式计算的支持和自动梯度计算有助于从前向表达式自动执行后向传递。

当然,由于使用 Python,它面临运行速度慢的风险,但高性能 C++ API(libtorch)消除了这种开销。这使得从研发到生产的过渡非常顺利。这是使用 PyTorch 的另一个理由!

让我们看一下使用 PyTorch 应用程序可以获得的一些有趣的结果。

图片
图片

为了让您对 PyTorch 更加着迷,这里列出了涉及 PyTorch 的非常酷的项目。

PyTorch 库概述

现在我们已经了解了 PyTorch 及其独特之处,让我们来看看 PyTorch 项目的基本流程。下图描述了典型的工作流程以及与每个步骤相关的重要模块。

图片
基本 PyTorch 工作流程

我们将在这里简要讨论的重要 PyTorch 模块是:torch.nn、torch.optim、torch.utils 和 torch.autograd。

1. 数据加载和处理

任何深度学习项目的第一步都是处理数据加载和处理。PyTorch 通过torch.utils.data 提供相关实用程序。

该模块中的两个重要类是Dataset和DataLoader。

  • 数据集建立在Tensor数据类型之上,主要用于自定义数据集。
  • 当您拥有大型数据集并且想要从后台的数据集加载数据以便其准备就绪并等待训练循环时,将使用DataLoader 。

如果我们可以访问多台机器或 GPU,我们还可以使用torch.nn.DataParallel和torch.distributed。

2. 建立神经网络

torch.nn模块用于创建神经网络。它提供所有常见的神经网络层,例如全连接层、卷积层、激活和损失函数等。

一旦创建了网络架构并且数据已准备好输入到网络,我们就需要一些技术来更新权重和偏差,以便网络开始学习。这些实用程序在torch.optim模块中提供。同样,对于反向传递过程中所需的自动微分,我们使用torch.autograd模块。

3. 模型推理与兼容性

模型训练完成后,可以用于预测测试用例甚至新数据集的输出。这个过程称为模型推理。

PyTorch 还提供TorchScript,可用于独立于 Python 运行时运行模型。这可以被认为是一个虚拟机,其指令主要针对张量。

您还可以将使用 PyTorch 训练的模型转换为ONNX 等格式,这样您就可以在其他 DL 框架(如 MXNet、CNTK、Caffe2)中使用这些模型。您还可以将onnx模型转换为 Tensorflow。

张量简介

到目前为止,在这篇文章中,我们已经讨论了为什么你应该学习 PyTorch。现在是时候开始同样的旅程了。我们将从 Tensors(PyTorch 中使用的核心数据结构)开始。

张量只是矩阵的一个花哨名称。如果您熟悉 NumPy 数组,那么理解和使用 PyTorch 张量将非常容易。标量值由 0 维张量表示。类似地,列/行矩阵使用 1-D 张量表示,依此类推。以下显示了具有不同维度的张量的一些示例,以便您直观地了解。

图片
PyTorch 中张量的维度

在我们开始介绍 Tensors 之前,让我们通过运行下面给出的命令来安装 PyTorch 1.1.0。

1conda install -c pytorch pytorch-cpu

就这样,您现在可以开始使用 PyTorch 了!现在让我们开始吧。我们建议您使用Google Colab并跟着做。从菜单中选择 GPU 运行时类型。

构建你的第一个张量

让我们看看如何创建 PyTorch Tensor。首先,我们将导入 PyTorch。

下载代码 为了轻松学习本教程,请点击下面的按钮下载代码。免费!

下载代码

123456789101112十三1415import torch # Create a Tensor with just ones in a column= torch.ones(5) # Print the tensor we createdprint(a) # tensor([1., 1., 1., 1., 1.]) # Create a Tensor with just zeros in a column= torch.zeros(5)print(b) # tensor([0., 0., 0., 0., 0.])

我们可以类似地创建具有自定义值的张量,如下所示。

1234= torch.tensor([1.02.03.04.05.0])print(c) # tensor([1., 2., 3., 4., 5.])

在上述所有情况下,我们都创建了单维向量或张量。现在,让我们创建一些更高维度的张量。

123456789101112十三1415161718192021222324二十五二十六二十七二十八二十九= torch.zeros(3,2)print(d) # tensor([[0., 0.],#        [0., 0.],#        [0., 0.]]) = torch.ones(3,2)print(e) # tensor([[1., 1.],#        [1., 1.],#        [1., 1.]]) = torch.tensor([[1.02.0],[3.04.0]])print(f) # tensor([[1., 2.],#        [3., 4.]]) # 3D Tensor= torch.tensor([[[1.2.], [3.4.]], [[5.6.], [7.8.]]])print(g) # tensor([[[1., 2.],#         [3., 4.]],##        [[5., 6.],#         [7., 8.]]])

我们还可以使用shape方法找出张量的形状。

12345678print(f.shape)# torch.Size([2, 2]) print(e.shape)# torch.Size([3, 2]) print(g.shape)# torch.Size([2, 2, 2])

访问 Tensor 中的一个元素

现在我们已经创建了一些张量,让我们看看如何访问张量中的元素。首先让我们看看如何对 1D 张量(又称向量)执行此操作。

1234# Get element at index 2print(c[2]) # tensor(3.)

那么 2D 或 3D 张量呢?回想一下我们在上一节中提到的张量维度。要访问张量中的一个特定元素,我们需要指定等于张量维度的索引。这就是为什么对于张量c我们只需要指定一个索引。

123456789101112十三14# All indices starting from 0 # Get element at row 1, column 0print(f[1,0])# We can also use the followingprint(f[1][0]) # tensor(3.) # Similarly for 3D Tensorprint(g[1,0,0])print(g[1][0][0]) # tensor(5.)

但是如果你想访问 2D 张量中的整行怎么办?我们可以使用与 NumPy 数组中相同的语法。

123456789101112十三14# All elementsprint(f[:]) # All elements from index 1 to 2 (inclusive)print(c[1:3]) # All elements till index 4 (exclusive)print(c[:4]) # First rowprint(f[0,:]) # Second columnprint(f[:,1])

指定元素的数据类型

每当我们创建一个张量时,PyTorch 都会决定张量元素的数据类型,以便数据类型可以覆盖所有张量元素。我们可以在创建张量时通过指定数据类型来覆盖它。

123456789101112十三1415161718192021222324二十五二十六int_tensor = torch.tensor([[1,2,3],[4,5,6]])print(int_tensor.dtype) # torch.int64 # What if we changed any one element to floating point number?int_tensor = torch.tensor([[1,2,3],[4.,5,6]])print(int_tensor.dtype) # torch.float32 print(int_tensor) # tensor([[1., 2., 3.],#        [4., 5., 6.]])  # This can be overridden as followsint_tensor = torch.tensor([[1,2,3],[4.,5,6]], dtype=torch.int32)print(int_tensor.dtype) # torch.int32print(int_tensor) # tensor([[1, 2, 3],#        [4, 5, 6]], dtype=torch.int32)

张量到/来自 NumPy 数组

我们曾多次提到 PyTorch 张量和 NumPy 数组非常相似。这引发了一个问题:是否可以将一种数据结构转换为另一种数据结构。让我们看看如何做到这一点。

123456789101112十三14151617# Import NumPyimport numpy as np # Tensor to Arrayf_numpy = f.numpy()print(f_numpy) # array([[1., 2.],#       [3., 4.]], dtype=float32) # Array to Tensor= np.array([[8,7,6,5],[4,3,2,1]])h_tensor = torch.from_numpy(h)print(h_tensor) # tensor([[8, 7, 6, 5],#        [4, 3, 2, 1]])

张量的算术运算

现在到了下一步的时候了。让我们看看如何对 PyTorch 张量执行算术运算。

123456789101112十三1415161718192021222324二十五二十六二十七二十八二十九三十31三十二33三十四三十五三十六三十七三十八三十九4041四十二43四十四四十五四十六四十七四十八49# Create tensortensor1 = torch.tensor([[1,2,3],[4,5,6]])tensor2 = torch.tensor([[-1,2,-3],[4,-5,6]]) # Additionprint(tensor1+tensor2)# We can also useprint(torch.add(tensor1,tensor2)) # tensor([[ 0,  4,  0],#        [ 8,  0, 12]]) # Subtractionprint(tensor1-tensor2)# We can also useprint(torch.sub(tensor1,tensor2)) # tensor([[ 2,  0,  6],#        [ 0, 10,  0]]) # Multiplication# Tensor with Scalarprint(tensor1 * 2)# tensor([[ 2,  4,  6],#        [ 8, 10, 12]]) # Tensor with another tensor# Elementwise Multiplicationprint(tensor1 * tensor2)# tensor([[ -1,   4,  -9],#        [ 16, -25,  36]]) # Matrix multiplicationtensor3 = torch.tensor([[1,2],[3,4],[5,6]])print(torch.mm(tensor1,tensor3))# tensor([[22, 28],#        [49, 64]]) # Division# Tensor with scalarprint(tensor1/2)# tensor([[0, 1, 1],#        [2, 2, 3]]) # Tensor with another tensor# Elementwise divisionprint(tensor1/tensor2)# tensor([[-1,  1, -1],#        [ 1, -1,  1]])

CPU 与 GPU 张量

PyTorch 针对 CPU 和 GPU 提供了不同的 Tensor 实现。每个张量都可以转换为 GPU,以便执行大规模并行、快速计算。对张量执行的所有操作都将使用 PyTorch 附带的 GPU 特定例程执行。

如果您无法使用 GPU,则可以在 Google Colab 上执行这些示例。选择 GPU 作为运行时。

让我们首先看看如何为 GPU 创建张量。

1234567# Create a tensor for CPU# This will occupy CPU RAMtensor_cpu = torch.tensor([[1.02.0], [3.04.0], [5.06.0]], device='cpu') # Create a tensor for GPU# This will occupy GPU RAMtensor_gpu = torch.tensor([[1.02.0], [3.04.0], [5.06.0]], device='cuda')

如果您正在使用 Google Colab,请关注右上角的 RAM 消耗计,您会看到在创建tensor_gpu后 GPU RAM 消耗就会增加。

与张量创建一样,对 CPU 和 GPU 张量执行的操作也不同,并且会消耗与指定设备相对应的 RAM。

123456# This uses CPU RAMtensor_cpu = tensor_cpu * 5 # This uses GPU RAM# Focus on GPU RAM Consumptiontensor_gpu = tensor_gpu * 5

这里要注意的关键点是,在 GPU 张量操作中没有信息流向 CPU(除非我们打印或访问张量)。

我们可以将 GPU 张量移动到 CPU 或反之亦然,如下所示。

12345# Move GPU tensor to CPUtensor_gpu_cpu = tensor_gpu.to(device='cpu') # Move CPU tensor to GPUtensor_cpu_gpu = tensor_cpu.to(device='cuda')
图片

就这些了,朋友们!

简单回顾一下,在这篇文章中,我们讨论了 PyTorch、它的独特之处以及为什么要学习它。我们还深入讨论了 PyTorch 工作流程和 PyTorch Tensor 数据类型。

源代码:

http://www.gitpp.com/datasets/learnopencv-cn/blob/master/PyTorch-for-Beginners/PyTorch_for_Beginners.ipynb

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注