11.20Pytorch_概数和基础
一、初识Torch
PyTorch,简称Torch,主流的经典的深度学习框架,如果你只想掌握一个深度学习框架,那就毫不犹豫的选择他吧!
**翻译:**用Torch进行深度学习。
通过本阶段的学习, 各位大佬将熟练掌握PyTorch的使用,为后续学习网络搭建、模型训练等打下基础。
1. 生涩的简介
PyTorch是一个基于Python的深度学习框架,它提供了一种灵活、高效、易于学习的方式来实现深度学习模型。PyTorch最初由Facebook开发,被广泛应用于计算机视觉、自然语言处理、语音识别等领域。
PyTorch使用张量(tensor)来表示数据,可以轻松地处理大规模数据集,且可以在GPU上加速。
PyTorch提供了许多高级功能,如**自动微分(automatic differentiation)、自动求导(automatic gradients)**等,这些功能可以帮助我们更好地理解模型的训练过程,并提高模型训练效率。
2. 多彩的江湖
除了PyTorch,还有很多其它常见的深度学习框架:
- TensorFlow: Google开发,广泛应用于学术界和工业界。TensorFlow提供了灵活的构建、训练和部署功能,并支持分布式计算。
- Keras: Keras是一个高级神经网络API,已整合到TensorFlow中。
- PaddlePaddle: PaddlePaddle(飞桨)是百度推出的开源深度学习平台,旨在为开发者提供一个易用、高效的深度学习开发框架。
- MXNet:由亚马逊开发,具有高效的分布式训练支持和灵活的混合编程模型。
- Caffe:具有速度快、易用性高的特点,主要用于图像分类和卷积神经网络的相关任务。
- CNTK :由微软开发的深度学习框架,提供了高效的训练和推理性能。CNTK支持多种语言的接口,包括Python、C++和C#等。
- Chainer:由Preferred Networks开发的开源深度学习框架,采用动态计算图的方式。
框架就是一个第三方包而已,用的时候是需要安装一下的~
3. 无聊的安装
建议(非常强烈的那种)用Anaconda创建一个虚拟环境,用于运行安装你的PyTorch
conda create -n universal python=3.9
3.1 基础认知
cuDNN(CUDA Deep Neural Network library)和 CUDA(Compute Unified Device Architecture)密切相关,它们共同构成了高性能 GPU计算的基础,尤其在深度学习领域。
3.1.1 CUDA
CUDA(Compute Unified Device Architecture),统一计算设备架构,是由 NVIDIA 提供的并行计算平台和编程模型。它允许开发者利用 NVIDIA GPU 的强大计算能力进行通用计算,包括科学计算、机器学习、图像处理和视频处理等。CUDA提供了GPU并行计算的底层基础,使GPU能够解决复杂的计算问题。
3.1.2 cuDNN
cuDNN是基于CUDA的深度神经网络加速库,提供了针对深度学习常见操作(如卷积、池化、归一化、激活函数等)的高度优化实现。
- 性能优化:cuDNN 为卷积神经网络等深度学习模型的训练和推理提供了极高的性能优化。它利用 CUDA 在 GPU 上进行加速计算,充分发挥了 GPU 的并行计算能力。
- 易用性:cuDNN 被集成在主流的深度学习框架(如 TensorFlow、PyTorch、MXNet 等)中,用户直接通过框架调用 cuDNN 的功能,无需关心底层实现细节。
3.1.3 依赖与协同
-
依赖:cuDNN是建立在CUDA之上的库,它依赖于 CUDA 提供的基础计算能力。因此,使用 cuDNN 必须先安装 CUDA。
-
协同:在深度学习框架中,CUDA 提供了底层的 GPU 计算能力,而 cuDNN 通过调用 CUDA 来优化和加速深度学习操作。这种协同工作大幅提升了深度学习模型的训练和推理速度。
3.1.4 版本兼容
使用 cuDNN 时需要确保它与 CUDA 版本的兼容性。
3.2 GPU驱动
如果有独立显卡,在安装PyTorch时一定要装CUDA,那如何选择CUDA版本呢?
3.2.1 驱动更新
打开GEFORCE进行驱动更新
安装成功:
3.2.2 版本检查
在cmd里面,输入nvidia-smi查看GPU驱动程序版本:
要保证你选择的CUDA版本号<=你的GPU驱动程序版本
3.3 开始安装
根据自己的系统及显卡情况灵活选择~
3.3.1 安装CUDA
在安装PyTorch时无需单独安装CUDA,安装包会根据你选择的 CUDA 版本自动包含所需的CUDA库。
3.3.2 安装cuDNN
在安装PyTorch时无需单独安装cuDNN,安装包会包含与指定 CUDA 版本兼容的 cuDNN,因此只需选择合适的 CUDA 版本。
3.3.2 安装PyTorch
在官方文档里面找到适合你设备的PyTorch版本及对应的安装指令执行即可:https://pytorch.org/get-started/previous-versions/
针对我的网络及设备情况,我复制了如下指令完成了Torch的安装:成不成的看天意吧~
pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu116
注:选择使用1.13.1版本,比较稳定,但一些新的特性不兼容。
二、Tensor概述
PyTorch会将数据封装成张量(Tensor)进行计算,所谓张量就是元素为相同类型的多维矩阵。
张量可以在 GPU 上加速运行。
1. 概念
张量是一个多维数组,通俗来说可以看作是扩展了标量、向量、矩阵的更高维度的数组。张量的维度决定了它的形状(Shape),例如:
- 标量 是 0 阶张量,只有大小没有方向(温度,高度),如
a = torch.tensor(5)
- 向量 是 1 阶张量,具有大小和方向(加速度,力),如
b = torch.tensor([1, 2, 3])
- 2维矩阵 是 2 阶张量,线性变换(旋转矩阵,位移矩阵),,如
c = torch.tensor([[1, 2], [3, 4]])
- 更高维度的张量,如3维、4维等,通常用于表示图像、视频数据等复杂结构。
2. 特点
- 动态计算图:PyTorch 支持动态计算图,这意味着在每一次前向传播时,计算图是即时创建的。
- GPU 支持:PyTorch 张量可以通过
.to('cuda')
移动到 GPU 上进行加速计算。 - 自动微分:通过
autograd
模块,PyTorch 可以自动计算张量运算的梯度,这对深度学习中的反向传播算法非常重要。
3. 数据类型
PyTorch中有3种数据类型:浮点数、整数、布尔。其中,浮点数和整数又分为8位、16位、32位、64位,加起来共9种。
为什么要分为8位、16位、32位、64位呢?
场景不同,对数据的精度和速度要求不同。通常,移动或嵌入式设备追求速度,对精度要求相对低一些。精度越高,往往效果也越好,自然硬件开销就比较高。
三、Tensor的创建
在Torch中张量以 “类” 的形式封装起来,对张量的一些运算、处理的方法被封装在类中,官方文档:
https://pytorch.org/docs/stable/torch.html#tensors
1. 基本创建方式
以下讲的创建tensor的函数中有两个有默认值的参数dtype和device, 分别代表数据类型和计算设备,可以通过属性dtype和device获取。
1.1 torch.tensor
注意这里的tensor是小写,该API是根据指定的数据创建张量。
import torch
import numpy as np
def test001():
# 1. 用标量创建张量
shape0 = torch.tensor(5)
print(shape0, shape0.shape)
# 2. 使用numpy随机一个数组创建张量
data = np.random.randn(3, 4)
data = torch.tensor(data)
print(data, data.shape, data.device)
# 3. 根据list创建tensor
data = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
data = torch.tensor(data)
print(data, data.shape, data.dtype)
pass
if __name__ == "__main__":
test001()
1.2 torch.Tensor
注意这里的Tensor是大写,该API根据形状创建张量,其也可用来创建指定数据的张量。
import torch
import numpy as np
def test002():
# 1. 根据形状创建张量
tensor1 = torch.Tensor(2, 3)
print(tensor1)
# 2. 也可以是具体的值
tensor2 = torch.Tensor([[1, 2, 3], [4, 5, 6]])
print(tensor2, tensor2.shape, tensor2.dtype)
tensor3 = torch.Tensor([10])
print(tensor3, tensor3.shape, tensor3.dtype)
if __name__ == "__main__":
test002()
1.3 torch.IntTensor
用于创建指定类型的张量,还有诸如Torch.FloatTensor、 torch.DoubleTensor、 torch.LongTensor…等。
如果数据类型不匹配,那么在创建的过程中会进行类型转换,要尽可能避免,防止数据丢失。
import torch
def test003():
# 1. 创建指定类型的张量
tt1 = torch.IntTensor(2, 3)
print(tt1)
tt2 = torch.FloatTensor(3, 3)
print(tt2, tt2.dtype)
tt3 = torch.DoubleTensor(3, 3)
print(tt3, tt3.dtype)
tt4 = torch.LongTensor(3, 3)
print(tt4, tt4.dtype)
tt5 = torch.ShortTensor(3, 3)
print(tt5, tt5.dtype)
if __name__ == "__main__":
test003()
2. 创建线性和随机张量
在 PyTorch 中,可以轻松创建线性张量和随机张量。
2.1 创建线性张量
使用torch.arange 和 torch.linspace 创建线性张量:
import torch
import numpy as np
# 不用科学计数法打印
torch.set_printoptions(sci_mode=False)
def test004():
# 1. 创建线性张量
r1 = torch.arange(0, 10, 2)
print(r1)
# 2. 在指定空间按照元素个数生成张量:等差
r2 = torch.linspace(3, 10, 10)
print(r2)
# 3. 在指定空间按照元素个数生成张量:等比
r3 = torch.logspace(3, 10, 5, base=2)#在2^3到2^10之间均匀生成5个数 base默认为10
print(r3)
if __name__ == "__main__":
test004()
2.2 随机张量
使用torch.randn 创建随机张量。
2.2.1 随机数种子
随机数种子(Random Seed)是一个用于初始化随机数生成器的数值。随机数生成器是一种算法,用于生成一个看似随机的数列,但如果使用相同的种子进行初始化,生成器将产生相同的数列。
随机数种子的设置和获取:
import torch
def test001():
# 设置随机数种子
torch.manual_seed(123)
# 获取随机数种子
print(torch.initial_seed())
if __name__ == "__main__":
test001()
2.2.2 随机张量
在 PyTorch 中,种子影响所有与随机性相关的操作,包括张量的随机初始化、数据的随机打乱、模型的参数初始化等。通过设置随机数种子,可以做到模型训练和实验结果在不同的运行中进行复现。
import torch
def test001():
# 1. 设置随机数种子
torch.manual_seed(123)
# 2. 获取随机数种子
print(torch.initial_seed())
# 3. 生成随机张量
print(torch.rand(2, 3))
# 4. 生成随机张量:标准正态分布
print(torch.randn(2, 3))
# 5. 原生服从正态分布:均值为2, 方差为3,形状为1*4的正态分布
print(torch.normal(mean=2, std=3, size=(1, 4)))
if __name__ == "__main__":
test001()
注:不设置随机种子时,每次打印的结果不一样。
3. 创建01张量
在 PyTorch 中,你可以通过几种不同的方法创建一个只包含 0 和 1 的张量。
3.1 创建全0张量
torch.zeros 和 torch.zeros_like 创建全0张量。
import torch
import numpy as np
def test001():
# 创建全0张量
data = torch.zeros(2, 3)
print(data, data.dtype)
mask = np.ones((3, 4))
print(mask)
data = torch.zeros_like(torch.tensor(mask))
print(data)
if __name__ == "__main__":
test001()
3.2 创建全1张量
torch.ones 和 torch.ones_like 创建全1张量
import torch
import numpy as np
def test001():
# 创建全1张量
data = torch.ones(2, 3)
print(data, data.dtype)
mask = np.zeros((3, 4))
print(mask)
data = torch.ones_like(torch.tensor(mask))
print(data)
if __name__ == "__main__":
test001()
4. 创建指定值张量
torch.full 和 torch.full_like 创建全为指定值张量。
import torch
import numpy as np
def test001():
# 创建指定值的张量
data = torch.full((2, 3), 666.0)
print(data, data.dtype)
mask = np.zeros((3, 4))
data = torch.full_like(torch.tensor(mask), 999)
print(data)
if __name__ == "__main__":
test001()
5. 创建单位矩张量
创建对角线上为1的单位张量…
import torch
import numpy as np
def test002():
data = torch.eye(4)
print(data)
if __name__ == "__main__":
test002()