自然语言处理pytorch基础入门(必备基础知识)(代码片段)

ZSYL ZSYL     2023-01-09     404

关键词:

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。但是,可以在初始化时指定张量,也可以在以后使用类型转换方法将张量转换为另一种类型(floatlongdouble等)。有两种方法可以指定初始化类型,一种是直接调用特定张量类型(如FloatTensorLongTensor)的构造函数,另一种是使用特殊的方法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、数学基础:微积... 查看详情