关键词:
PyTorch 基础
在本书中,我们广泛地使用 PyTorch 来实现我们的深度学习模型。PyTorch 是一个开源、社区驱动的深度学习框架。与 Theano、Caffe 和 TensorFlow 不同,PyTorch 实现了一种“基于磁带的自动微分”方法,允许我们动态定义和执行计算图形。这对于调试和用最少的努力构建复杂的模型非常有帮助。
动态 VS 静态计算图 像 Theano、Caffe 和 TensorFlow 这样的静态框架需要首先声明、编译和执行计算图。虽然这会导致非常高效的实现(在生产和移动设置中非常有用),但在研究和开发过程中可能会变得非常麻烦。
像 Chainer、DyNet 和 PyTorch 这样的现代框架实现了动态计算图,从而支持更灵活的命令式开发风格,而不需要在每次执行之前编译模型。
动态计算图在建模 NLP 任务时特别有用,每个输入可能导致不同的图结构。
PyTorch 是一个优化的张量操作库,它提供了一系列用于深度学习的包。
这个库的核心是张量,它是一个包含一些多维数据的数学对象。
0 阶张量就是一个数字,或者标量。
一阶张量(一阶张量)是一个数字数组,或者说是一个向量。类似地,二阶张量是一个向量数组,或者说是一个矩阵。
因此,张量可以推广为标量的n
维数组。
在以下部分中,我们将使用 PyTorch 学习以下内容:
- 创建张量
- 操作与张量
- 索引、切片和与张量连接
- 用张量计算梯度
- 使用带有 gpu 的 CUDA 张量
在本节的其余部分中,我们将首先使用 PyTorch 来熟悉各种 PyTorch 操作。我们建议您现在已经安装了 PyTorch 并准备好了 Python 3.5+ 笔记本,并按照本节中的示例进行操作。我们还建议您完成本节后面的练习。
安装 PyTorch
第一步是通过在 pytorch.org 上选择您的系统首选项在您的机器上安装 PyTorch。选择您的操作系统,然后选择包管理器(我们推荐conda/pip
),然后选择您正在使用的 Python 版本(我们推荐 3.5+)。这将生成命令,以便您执行安装 PyTorch。在撰写本文时,conda 环境的安装命令如下:
conda install pytorch torchvision -c pytorch
注意:如果您有一个支持 CUDA 的图形处理器单元(GPU),您还应该选择合适的 CUDA 版本。要了解更多细节,请参考 pytorch.org 上的安装说明。
请参考: PyTorch 最新安装教程(2021-07-27)
创建张量
首先,我们定义一个辅助函数,描述(x
),它总结了张量x
的各种性质,例如张量的类型、张量的维数和张量的内容:
Input[0]:
def describe(x):
print("Type: ".format(x.type()))
print("Shape/size: ".format(x.shape))
print("Values: \\n".format(x))
PyTorch 允许我们使用torch
包以许多不同的方式创建张量。创建张量的一种方法是通过指定一个随机张量的维数来初始化它,如例 1-3 所示。
示例 1-3:在 PyTorch 中使用torch.Tensor
创建张量
Input[0]:
import torch
describe(torch.Tensor(2, 3))
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 3.2018e-05, 4.5747e-41, 2.5058e+25],
[ 3.0813e-41, 4.4842e-44, 0.0000e+00]])
我们还可以创建一个张量通过随机初始化值区间上的均匀分布(0,1
)或标准正态分布(从均匀分布随机初始化张量,说,是很重要的,正如您将看到的在第三章和第四章),见示例 1-4。
示例 1-4:创建随机初始化的张量
Input[0]:
import torch
describe(torch.rand(2, 3)) # uniform random
describe(torch.randn(2, 3)) # random normal
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0.0242, 0.6630, 0.9787],
[ 0.1037, 0.3920, 0.6084]])
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[-0.1330, -2.9222, -1.3649],
[ 2.3648, 1.1561, 1.5042]])
我们还可以创建张量,所有张量都用相同的标量填充。对于创建 0 或 1 张量,我们有内置函数,对于填充特定值,我们可以使用fill_()
方法。
任何带有下划线(_
)的 PyTorch 方法都是指就地(in place)操作;也就是说,它在不创建新对象的情况下就地修改内容,如示例 1-5 所示。
示例 1-5:创建填充的张量
Input[0]:
import torch
describe(torch.zeros(2, 3))
x = torch.ones(2, 3)
describe(x)
x.fill_(5)
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0., 0., 0.],
[ 0., 0., 0.]])
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1., 1., 1.],
[ 1., 1., 1.]])
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 5., 5., 5.],
[ 5., 5., 5.]])
示例 1-6 演示了如何通过使用 Python 列表以声明的方式创建张量。
示例 1-6:从列表创建和初始化张量
Input[0]:
x = torch.Tensor([[1, 2, 3],
[4, 5, 6]])
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1., 2., 3.],
[ 4., 5., 6.]])
值可以来自列表(如前面的示例),也可以来自 NumPy 数组。当然,我们也可以从 PyTorch 张量变换到 NumPy 数组。
注意,这个张量的类型是一个double
张量,而不是默认的FloatTensor
。这对应于 NumPy 随机矩阵的数据类型float64
,如示例 1-7 所示。
示例 1-7:从 NumPy 创建和初始化张量
Input[0]:
import torch
import numpy as np
npy = np.random.rand(2, 3)
describe(torch.from_numpy(npy))
Output[0]:
Type: torch.DoubleTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0.8360, 0.8836, 0.0545],
[ 0.6928, 0.2333, 0.7984]], dtype=torch.float64)
在处理使用 Numpy 格式数值的遗留库(legacy libraries)时,在 NumPy 和 PyTorch 张量之间切换的能力变得非常重要。
张量类型和大小
每个张量都有一个相关的类型和大小。使用torch
时的默认张量类型。张量构造函数是torch.FloatTensor
。但是,可以在初始化时指定张量,也可以在以后使用类型转换方法将张量转换为另一种类型(float
、long
、double
等)。有两种方法可以指定初始化类型,一种是直接调用特定张量类型(如FloatTensor
和LongTensor
)的构造函数,另一种是使用特殊的方法torch.tensor
,并提供dtype
,如例 1-8 所示。
示例 1-8:张量属性
Input[0]:
x = torch.FloatTensor([[1, 2, 3],
[4, 5, 6]])
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1., 2., 3.],
[ 4., 5., 6.]])
Input[1]:
x = x.long()
describe(x)
Output[1]:
Type: torch.LongTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1, 2, 3],
[ 4, 5, 6]])
Input[2]:
x = torch.tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int64)
describe(x)
Output[2]:
Type: torch.LongTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1, 2, 3],
[ 4, 5, 6]])
Input[3]:
x = x.float()
describe(x)
Output[3]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 1., 2., 3.],
[ 4., 5., 6.]])
我们利用张量对象的形状特性和尺寸方法来获取其尺寸的测量值。访问这些度量的两种方法基本上是相同的。在调试 PyTorch 代码时,检查张量的形状成为必不可少的工具。
张量操作
在创建了张量之后,可以像处理传统编程语言类型(如+
、-
、*
和/
)那样对它们进行操作。除了操作符,我们还可以使用.add()
之类的函数,如示例 1-9 所示,这些函数对应于符号操作符。
示例 1-9:张量操作:加法
Input[0]:
import torch
x = torch.randn(2, 3)
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0.0461, 0.4024, -1.0115],
[ 0.2167, -0.6123, 0.5036]])
Input[1]:
describe(torch.add(x, x))
Output[1]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0.0923, 0.8048, -2.0231],
[ 0.4335, -1.2245, 1.0072]])
Input[2]:
describe(x + x)
Output[2]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0.0923, 0.8048, -2.0231],
[ 0.4335, -1.2245, 1.0072]])
还有一些运算可以应用到张量的特定维数上。正如您可能已经注意到的,对于 2D 张量,我们将行表示为维度 0,列表示为维度 1,如示例 1-10 所示。
示例 1-10:基于维度的张量操作
Input[0]:
import torch
x = torch.arange(6)
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([6])
Values:
tensor([ 0., 1., 2., 3., 4., 5.])
Input[1]:
x = x.view(2, 3)
describe(x)
Output[1]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0., 1., 2.],
[ 3., 4., 5.]])
Input[2]:
describe(torch.sum(x, dim=0))
Output[2]:
Type: torch.FloatTensor
Shape/size: torch.Size([3])
Values:
tensor([ 3., 5., 7.])
Input[3]:
describe(torch.sum(x, dim=1))
Output[3]:
Type: torch.FloatTensor
Shape/size: torch.Size([2])
Values:
tensor([ 3., 12.])
Input[4]:
describe(torch.transpose(x, 0, 1))
Output[4]:
Type: torch.FloatTensor
Shape/size: torch.Size([3, 2])
Values:
tensor([[ 0., 3.],
[ 1., 4.],
[ 2., 5.]])
通常,我们需要执行更复杂的操作,包括索引、切片、连接和突变(indexing,slicing,joining and mutation)的组合。与 NumPy 和其他数字库一样,PyTorch 也有内置函数,可以使此类张量操作非常简单。
索引,切片和连接
如果您是一个 NumPy 用户,那么您可能非常熟悉示例 1-11 中所示的 PyTorch 的索引和切片方案。
示例 1-11:切片和索引张量
Input[0]:
import torch
x = torch.arange(6).view(2, 3)
describe(x)
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0., 1., 2.],
[ 3., 4., 5.]])
Input[1]:
describe(x[:1, :2])
Output[1]:
Type: torch.FloatTensor
Shape/size: torch.Size([1, 2])
Values:
tensor([[ 0., 1.]])
Input[2]:
describe(x[0, 1])
Output[2]:
Type: torch.FloatTensor
Shape/size: torch.Size([])
Values:
1.0
示例 1-12 演示了 PyTorch 还具有用于复杂索引和切片操作的函数,您可能对有效地访问张量的非连续位置感兴趣。
示例 1-12:复杂索引:张量的非连续索引
Input[0]:
indices = torch.LongTensor([0, 2])
describe(torch.index_select(x, dim=1, index=indices))
Output[0]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 2])
Values:
tensor([[ 0., 2.],
[ 3., 5.]])
Input[1]:
indices = torch.LongTensor([0, 0])
describe(torch.index_select(x, dim=0, index=indices))
Output[1]:
Type: torch.FloatTensor
Shape/size: torch.Size([2, 3])
Values:
tensor([[ 0., 1., 2.],
[ 0., 1., 2.]])
Input[2]:
row_indices = torch.arange(2).long()
col_indices = torch.LongTensor([0, 1])
describe(x[row_indices, col_indices])
Output[2]:
Type: torch.FloatTensor
Shape/size: torch查看详情
对比学习:《深度学习之pytorch》《pytorch深度学习实战》+代码
...深度学习平台,该平台简单易用上手快,从计算机视觉、自然语言处理再到强化学习,PyTorch的功能强大,支持PyTorch的工具包有用于自然语言处理的AllenNLP,用于概率图模型的Pyro,扩展了PyTorch的功能。通过学习《深度学习入门之... 查看详情
python零基础到入门python基础知识必备篇——python简介(代码片段)
目录📢前言👑Python简介🌲Python诞生背景🌲Python特点🌲编程语言排行榜💬总结📢前言本文章是【Python零基础到入门专栏】学习的系列文章Python专栏传送门在此:https://blog.csdn.net/zhangay1998/category_110... 查看详情
nlp汉语自然语言处理入门基础知识介绍
NLP汉语自然语言处理入门基础知识介绍自然语言处理定义:自然语言处理是一门计算机科学、人工智能以及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分。这个... 查看详情
python3详细的数组基础操作-入门必备[列表的操作]
前言数组几乎是所有编程语言的都拥有的数据类型,它是用于存储数据的集合,其实数组就是一个容器,一片连续的存储单元。在其他编程语言中叫做数组,但是Python没有数组类型,而与之对应的是列表,字典,元组.在java或者C/C++等静... 查看详情
angularjs实用基础知识---入门必备
前言今天来和大家学习一下AngularJS…… AngularJS通过新的属性和表达式扩展了HTML。 AngularJS可以构建一个单一页面应用程序。 AngularJS学习起来非常简单。 一、AngularJS指令与表达式【AngularJS常用指令】1、ng-app:声... 查看详情
开山篇自然语言处理(pytorch版)(代码片段)
自然语言处理(PyTorch版)PyTorch自然语言处理自然语言处理-基础介绍监督学习范式观测和目标编码One-Hot表示TF表示TF-IDF表示目标编码计算图引用说明贡献指南联系方式负责人其他下载DockerPYPINPMPyTorch自然语言处理自然语言... 查看详情
深度学习基础:4.pytorch搭建基础网络模型(代码片段)
...库是torch,根据不同领域细分可以分成计算机视觉、自然语言处理和语音处理,这三个领域分别有自己对应的库,即torchvision、torchtext、t 查看详情
hanlp中文自然语言处理入门基础知识
自然语言处理定义:自然语言处理是一门计算机科学、人工智能以及语言学的交叉学科。虽然语言只是人工智能的一部分(人工智能还包括计算机视觉等),但它是非常独特的一部分。这个星球上有许多生物拥有超过人类的视觉... 查看详情
计算机语言编程入门基础
编程入门基础(一)HDU1000HDU1089-HDU1096A+BforInput-OutputPractice(I)-(VIII)(入门必备训练)-海岛Blog-CSDN博客Bailian2684POJNOI0105-34求阶乘的和【迭代】_海岛Blog-CSDN博客Bailian2685打印水仙花数【入门】_海岛Blog-CSD 查看详情
编程必备基础-音视频小白系统入门课
...统入门课普适所有方向程序员,系统补足你缺乏的音视频基础知识 5G的商用,使高效高清的直播和视频成为刚需,短视频、娱乐直播等都与音视频联系紧密,各大互联网公司都在储备音视频方向的开发者。但是,网络上关于... 查看详情
pytorch入门机器学习基础
机器学习的基本任务一般分为四大类:监督学习、无监督学习、半监督学习、强化学习。#mermaid-svg-9yWEvSSLOIFpUVSx.labelfont-family:\'trebuchetms\',verdana,arial;font-family:var(--mermaid-font-family);fill:#333;color:#333#mermaid-svg-9yW 查看详情
零基础如何学好大数据?必备需要学习知识
大数据是对海量数据进行存储、计算、统计、分析处理的一系列处理手段,处理的数据量通常是TB级,甚至是PB或EB级的数据,这是传统数据处理手段所无法完成的,其涉及的技术有分布式计算、高并发处理、高可用处理、集群、... 查看详情
深度学习---从入门到放弃pytorch基础(代码片段)
深度学习—从入门到放弃(一)pytorchTensor类似于numpy的array,pandas的dataframe;在pytorch里的数据结构是tensor,即张量tensor简单操作1.Flattenandreshape###Originalz:tensor([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11]])Flatte 查看详情
pytorch学习笔记基础知识
PyTorch深度学习:60分钟入门(Translation) 查看详情
《自然语言处理实战入门》----笔试面试题:机器学习基础(41-60)
机器学习综合选择题与详解【5年大厂,3年模拟】:面试、笔试题集:机器学习基础1-20面试、笔试题集:机器学习基础21-40面试、笔试题集:机器学习基础41-60面试、笔试题集:机器学习基础61-80面试、笔试题集:机器学习基础81-... 查看详情
java入门--------必备知识(基础知识:输出语句与输入语句)(代码片段)
一、输入语句:java使用Scanner语句进行输入操作: importjava.util.Scanner;输入一个整数 Scannersc=newScanner(System.in); inta=sc.nextInt(); 输入一个浮点数 Scannersc=newScanner(System.in); floatb=sc.nex 查看详情
零基础如何入门到精通人工智能pytorch,深度学习,如何跟进ai领域的最新算法,如何读论文找代码
零基础如何入门人工智能,如何跟进AI领域的最新算法,如何读论文、找代码。【入门人工智能】1、掌握一门编程语言:Python【B站小甲鱼】零基础入门学习Pythonhttps://www.bilibili.com/video/BV1c4411e77t2、数学基础:微积... 查看详情