目录
第一章 PyTorch介绍及安装
1.1 PyTorch简介
Facebook公司开发的PyTorch框架是端到端深度学习平台最受欢迎的框架,是一个由Python、C++和CUDA语言编写的免费开源软件库,被广泛用于计算机视觉、语音识别和自然语言处理等深度学习领域。PyTorch有两大优势:一是具有强大GPU加速的张量计算;二是包含自动求导系统的深度神经网络。
PyTorch的前身可追溯到2002年诞生于纽约大学的Torch,Facebook人工智能研究院于2017年在GitHub上开源了PyTorch,并迅速占据GitHub热度榜榜首。
1.2 PyTorch安装
1.2.1 Windows系统安装
1. CPU版PyTorch
pip install torch
2. GPU版Pytorch
步骤一
检查是否有合适的GPU,若有需要安装CUDA与CuDNN;
步骤二
进入PyTorch官网,检查目前PyTorch支持的CUDA版本;
https://pytorch.org/get-started/locally/
步骤三
进入CUDA官网,点击CUDA Toolkit 11.8.0,下载Base installer并安装;
https://developer.nvidia.com/cuda-downloads
步骤四
进入CuDNN官网,登录账号,选择最新版,点击Base installe;
步骤五
解压cudnn压缩包,并将其复制到cuda安装路径下;
步骤六
下载torch、torchvision和torchaudio
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
1.2.2 Linux系统安装
1. CPU版PyTorch
待写
2. GPU版Pytorch
待写
第二章 PyTorch 基础编程
2.1 张量定义
- 张量的定义
张量(Tensor)是PyTorch的核心数据结构。张量的维度(dimension)也称为阶。零阶张量称为标量(scalar),1阶张量称为向量(vector),2阶张量称为矩阵(matrix),3阶以上的就直接称为张量。
Tensor类的shape属性和size()函数返回张量的具体维度分量。零阶张量,一般用于超参数、参数和损失函数。一阶张量用作神经网络偏置,以及神经网络各层的输入。二阶张量一般用作神经网络的批量输入和输出,以及线性神经元的权重参数。三阶张量通常用作图片表示,一张彩色图片的RGB这三个通道占一维,宽和高各占一维。四维张量通常在卷积神经网络中表示图像。一次输入到神经网络中进行训练的样本数目称为批大小。 - Tensor与Variable的差异
在PyTorch中,Tensor和Variable有一定的关系,但在最新的PyTorch版本中,Variable已经被弃用了。在早期版本的PyTorch中,Variable是一个用于自动求导的类,它封装了Tensor并提供了自动求导的功能。 当在计算图中使用Variable时,它会跟踪计算图的操作,并允许你对变量进行梯度计算。然而,从PyTorch 0.4.0版本开始,Variable被弃用了,因为自动求导的功能已经集成到了Tensor中。在当前版本的PyTorch中,Tensor是主要的数据类型。Tensor对象支持各种数学操作和函数,可以进行高效的计算和操作。而且,Tensor对象还具有自动求导的功能,可以通过设置requires_grad属性为True来跟踪操作并计算梯度。Variable与Tensor具体的数据结构如下图所示:
![]() |
![]() |
图 a Variable | 图 b Tensor |
1)Variable数据类型
在pytorch 0.4.0版本之前,Variable是torch.autograd中的数据类型,主要用于封装Tensor,然后进行自动求导。Variable对象具有以下几个主要的属性:
- data:被包装的Tensor对象,存储实际的数据。
- grad:一个Tensor对象,存储data的梯度。在进行反向传播时,梯度将累积到grad中。
- grad_fn:创建该Variable的函数(或操作)的引用。它是构建计算图的关键,用于实现自动求导。
- requires_grad:一个布尔值,指示是否需要计算梯度。如果设置为True,则Variable将跟踪操作并计算梯度;如果设置为False,则不会计算梯度。
- is_leaf:一个布尔值,指示该Variable是否是计算图中的叶子节点。叶子节点是由用户直接创建的Variable,而非通过计算得到的。
2)Tensor数据类型
在PyTorch 0.4.0及以后的版本中,Tensor对象支持自动求导,并且Variable类已经被弃用。Tensor对象具有以下几个主要的属性:
- dtype:表示张量的数据类型;
- shape:表示张量的形状,以元组形式表示;
- device:表示张量所在的设备,可以是GPU或CPU。如果张量位于GPU上,则可以利用GPU的并行计算能力来加速运算。
2.2 张量操作
2.2.1 创建张量
- 创建张量
1)判断是否为PyTorch张量
torch.is_tensor()函数可判断输入参数是否为PyTorch张量。
运行结果如下:import torch arr = [1, 2, 3] print(torch.is_tensor(arr))
2)从Python列表中创建张量False
torch.tensor()函数可直接从python列表中创建PyTorch张量。
运行结果如下:import torch arr = [1, 2, 3] t1 = torch.tensor(arr) print(f"t1是否为张量:{ torch.is_tensor(t1)}") print(f"t1中的数据:{ t1}")
3)初始化全0或全1张量t1是否为张量:True t1中的数据:tensor([1, 2, 3])
torch.ones()函数和torch.zeros()函数分别创建全1或全0张量。
运行结果如下:import torch t = torch.ones(5) t1 = torch.zeros(5, 6) print(f"t中的数据:{ t}") print(f"t1中的数据:{ t1}")
4)创建随机数张量t中的数据:tensor([1., 1., 1., 1., 1.]) t1中的数据:tensor([[0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0.]])
torch.randn()函数用于创建正态分布的随机张量,torch.rand()函数用于创建取值在[0, 1)范围内的均匀分布的随机张量。
运行结果如下:import torch t = torch.randn(2, 3) # 正态分布随机张量 t1 = torch.rand(2, 1) # 均匀分布随机张量 print(f"t中的数据:{ t}") print(f"t1中的数据:{ t1}")
注意:由于输出的是随机数,所以可能每次运行的实际输出不同于上一次运行结果。t中的数据:tensor([[-1.1226, 1.0770, 1.0084], [ 0.2833, 0.0693, -0.0252]]) t1中的数据:tensor([[0.7664], [0.6271]])
5)创建二维对角矩阵张量
torch.eye()函数用于创建二维对角矩阵张量,并不要求矩阵张量必须是方阵。
运行结果如下:import torch t = torch.eye(3) # 创建3*3的对角张量 t1 = torch.eye(2, 3) # 创建2*3的对角张量 print(f"t中的数据:{ t}") print(f"t1中的数据:{ t1}")
6)创建一维序列张量t中的数据:tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]]) t1中的数据:tensor([[1., 0., 0.], [0., 1., 0.]])
torch.arange()和torch.linspace()函数创建以为序列张量。torch.arange()函数输入参数start(默认参数0),end指定结束值,step(默认参数1)。
运行结果如下:import torch t = torch.arange(0, 30) t1 = torch.linspace(0, 30, 10) print(f"t中的数据:{ t}") print(f"t1中的数据:{ t1}")
注意:torch.arange()函数输出的序列不包含end值;torch.linspace()函数输出的序列包含end值。t中的数据:tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]) t1中的数据:tensor([ 0.0000, 3.3333, 6.6667, 10.0000, 13.3333, 16.6667, 20.0000, 23.3333, 26.6667, 30.0000])
7)创建取值为指定范围的随机置乱的张量
torch.arange()函数生成0~n-1的整数的随机排列,常用于数据采集样本的随机置乱。
运行结果如下:import torch t = torch.randperm(10) print(f"t中的数据:{ t}")
8)numpy数组与张量相互转换t中的数据:tensor([3, 1, 8, 4, 7, 6, 0, 2, 9, 5])
torch.from_numpy()函数将Numpy数组转换为Tens