目录

一. 深度学习简介和PyTorch入门

1.1 深度学习简介

1.1.1 深度学习的概念

1.1.2 深度学习与机器学习的差异

1.2 常用深度学习框架

1.3 PyTorch入门

1.3.1 CUDA和cuDNN

1.3.2 PyTorch简介

1.3.3 张量的基本类型

1.3.4 张量的基本创建方法

1.3.5 创建线性一维张量

1.3.6 创建随机张量

1.3.7 创建01张量以及指定值张量


一. 深度学习简介和PyTorch入门

1.1 深度学习简介

1.1.1 深度学习的概念

        深度学习(也被称为仿生物脑)是机器学习中的一种特殊方法,它使用被称为神经网络(也被称为仿生物神经元)的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,例如图像、声音和文本。

        深度学习的精度高,性能优于其他的机器学习算法,甚至在某些领域超过了人类,并且随着计算机硬件的发展,可以近似任意的非线性函数。

        但深度学习是一种“黑箱”模型,很难解释模型的工作机制,并且训练时间长,需要大量的计算资源,网络结构复杂,容易发生过拟合。

1.1.2 深度学习与机器学习的差异

        机器学习通常只需要较少的数据量,对于小规模数据集,机器学习算法仍然可以表现良好,而深度学习需要大量的数据来训练模型,数据量越大,深度学习模型的性能通常越好。

        机器学习通常对计算资源的要求较低,可以在普通的CPU上运行,而深度学习对计算资源的需求较高,通常需要GPU或TPU等专用硬件来加速训练过程。

        机器学习模型相对简单,易于理解和解释,而深度学习模型非常复杂,通常包含多层神经网络,并且是一种“黑箱”模型,难以解释其内部工作机制。

        机器学习依赖人工进行特征工程,而深度学习方法不需要人工进行特征工程,而是依赖算法从原始数据中自动学习特征。

1.2 常用深度学习框架

        常用的深度学习框架如下:

        Google开发的TensorFlow。

        Meta(前Facebook)开发的PyTorch,代码量少。

        百度开发的PaddlePaddle。

        多家国外大厂联合推出的ONNX,它使得不同的深度学习框架可以采用相同格式存储模型数据并交互,类似于一个中间件万物先转ONNX,ONNX再转万物

        上述框架的主要优势:生态良好,有着广泛的社区支持和资源;支持高效的分布式训练;灵活性和可扩展性好,有着丰富的工具和库以及广泛的硬件支持。

        常用的深度学习推理框架如下:

        Google开发的TensorFlow Lite(TF Lite)。

        NVIDIA开发的TensorRT。

1.3 PyTorch入门

1.3.1 CUDA和cuDNN

        CUDA(Compute Unified Device Architecture是一种并行计算平台编程模型,允许开发者利用NVIDIA GPU的强大计算能力进行通用计算。

        cuDNN(CUDA Deep Neural Network library是一个GPU加速库,专门用于深度神经网络的计算,能够加速深度学习模型的训练和推理。

1.3.2 PyTorch简介

        PyTorch一个Python深度学习框架,它将数据封装成张量(Tensor)来进行处理,该框架中的张量就是元素为同一种数据类型的多维矩阵

        在PyTorch中,张量以类(class)的形式封装起来,对张量的一些运算、处理的方法都被封装在类中。

1.3.3 张量的基本类型

        零维张量被称为标量(scalar)。

        一维张量被称为向量(vector)。

        二维张量被称为矩阵(matrix)。

        三维即以上的张量被称为多维张量。

        使用tensor.ndim属性可以查看张量的维度,使用tensor.shape属性或者tensor.size()方法可以查看张量的形状,具体示例如下:

import torch

t1 = torch.Tensor(3, 4)
print(t1.ndim) # 2
print(t1.shape) # torch.Size([3, 4])

1.3.4 张量的基本创建方法

        使用torch.tensor()方法可以根据指定数据(通常是嵌套列表或者多维数组)创建张量,具体示例如下:

import torch

t1 = torch.tensor([1, 2, 3])
print(t1) # tensor([1, 2, 3])
print(t1.dtype) # torch.int64

        注意:使用tensor.dtype可以查看张量内数据的类型,torch.tensor()方法默认的整数数值类型为int64,浮点数数值类似为float32,并且只有数据内有一个浮点数,则创建的张量的dtype即为float32。

        使用torch.Tensor()方法可以根据形状或数据来创建张量,如果传入一系列单独的数字,则视为传入了张量的形状,会创建对应形状的张量,而如果传入了一个嵌套列表,则视为传入了数据,会根据数据创建对应的张量,具体示例如下:

import torch

t1 = torch.Tensor(2, 3)
t2 = torch.Tensor([[1, 2, 3], [1, 2, 3]])
print(t1, t1.dtype)
'''
输出结果如下:
tensor([[0., 0., 0.],
        [0., 0., 0.]]) torch.float32
'''
print(t2, t2.dtype)
'''
输出结果如下:
tensor([[1., 2., 3.],
        [1., 2., 3.]]) torch.float32
'''

        注意:torch.Tensor()方法默认的数值类型为float32。

        使用torch.ShortTensor()方法可以创建内部数据类型为int16的张量

        使用torch.IntTensor()方法可以创建内部数据类型为int32的张量

        使用torch.LongTensor()方法可以创建内部数据类型为int64的张量

        使用torch.FloatTensor()方法可以创建内部数据类型为float32的张量

        使用torch.DoubleTensor()方法可以创建内部数据类型为float64的张量。

        注意:使用上述方法创建张量时使用方法与torch.Tensor()方法相同,可以传入张量的形状或者数据,上述方法会根据传入的参数来创建相应的张量,并且如果传入数据时,数据类型与上述方法期望的数据类型不一致,则会自动进行类型转换

1.3.5 创建线性一维张量

        使用torch.arange(start,end,step)方法可以在指定区间内按照步长生成元素,并组成一维张量,参数step即为步长,具体示例如下:

import torch

t1 = torch.arange(0, 10, 2)
print(t1, t1.ndim, t1.dtype) # tensor([0, 2, 4, 6, 8]) 1 torch.int64

        注意:该方法的默认数据类型为int64,并且不包含end位置的元素

        使用torch.linspace(start,end,steps)方法可以在指定区间内按照元素个数生成元素,并组成一维张量,参数steps即为元素个数,具体示例如下:

import torch

t1 = torch.linspace(0, 11, 10)
print(t1, t1.ndim, t1.dtype, sep='\n')
'''
输出结果如下:
tensor([ 0.0000,  1.2222,  2.4444,  3.6667,  4.8889,  6.1111,  7.3333,  8.5556,
         9.7778, 11.0000])
1
torch.float32
'''

        注意:该方法的默认数据类型为float32,并且包含end位置的元素

1.3.6 创建随机张量

        使用torch.random.initial_seed()方法可以查看当前随机数生成器的种子;使用torch.random.manual_seed(seed)方法可以手动设置随机数生成器的种子,设置种子后,可以确保每次运行代码时生成的随机数序列是相同的,从而提高实验的可重复性,示例如下:

import torch

print(torch.random.initial_seed()) # 输出 1282068280911500
torch.random.manual_seed(0)
print(torch.random.initial_seed()) # 输出 0

        使用torch.rand()方法会生成一个指定形状的、内部元素服从[0.0, 1.0)之间的均匀分布的张量;使用torch.randn()方法会生成一个指定形状的、内部元素服从标准正态分布的张量;使用torch.randint()方法会生成一个指定形状的、内部元素的值为指定范围内的整数的张量,上述三个方法的示例如下:

import torch

t1 = torch.rand(3, 2) # 参数为张量的形状, 默认内部数据类型为float32
print(t1, t1.dtype)
t2 = torch.randn(3, 2) # 参数为张量的形状, 默认内部数据类型为float32
print(t2, t2.dtype)
# 前两个参数为内部元素数值的上下限(包含左端点, 不包含右端点),第三个参数为张量的形状
# 默认内部数据类型为int64
t3 = torch.randint(1, 10, (3, 2)) 
print(t3, t3.dtype)
'''
tensor([[0.4242, 0.0415],
        [0.7549, 0.2448],
        [0.5447, 0.3105]]) torch.float32
tensor([[0.3451, 0.3092],
        [1.0184, 0.6811],
        [0.9581, 2.0704]]) torch.float32
tensor([[4, 6],
        [1, 7],
        [1, 5]]) torch.int64
'''

1.3.7 创建01张量以及指定值张量

        使用torch.zeros()方法torch.zeros_like()方法可以创建全0张量,使用方法如下:

import torch

# 1. 创建指定形状的全0张量, 参数为张量的形状(直接传入, 不需要封装到容器中)
t1 = torch.zeros(2, 3)
print(t1, t1.dtype)
# 2. 根据传入张量的形状创建全0张量, 注意:参数必须为张量
t2 = torch.zeros_like(t1)
print(t2, t2.dtype)
'''
tensor([[0., 0., 0.],
        [0., 0., 0.]]) torch.float32
tensor([[0., 0., 0.],
        [0., 0., 0.]]) torch.float32
'''

        注意:上述方法的默认内部数据类型为float32。

        使用torch.ones()方法torch.ones_like()方法可以创建全1张量,使用方法如下:

import torch

# 1. 创建指定形状的全1张量, 参数为张量的形状(直接传入, 不需要封装到容器中)
t1 = torch.ones(2, 3)
print(t1, t1.dtype)
# 2. 根据传入张量的形状创建全1张量, 注意:参数必须为张量
t2 = torch.ones_like(t1)
print(t2, t2.dtype)
'''
tensor([[1., 1., 1.],
        [1., 1., 1.]]) torch.float32
tensor([[1., 1., 1.],
        [1., 1., 1.]]) torch.float32
'''

        注意:上述方法的默认内部数据类型为float32。

        使用torch.full()方法torch.full_like()方法可以创建全为指定值张量,使用方法如下:

import torch

# 1. 创建指定形状并且指定值的张量,第一个参数为张量形状,第二个参数为张量的指定值
t1 = torch.full((2, 3), 6)
print(t1, t1.dtype)
# 2. 根据传入张量的形状创建指定值的张量,第一个参数必须为张量,第二个参数为张量的指定值
t2 = torch.full_like(t1, 8)
print(t2, t2.dtype)
'''
tensor([[6, 6, 6],
        [6, 6, 6]]) torch.int64
tensor([[8, 8, 8],
        [8, 8, 8]]) torch.int64
'''

        注意:在torch.full()方法中,如果指定值为整数则创建的张量的默认内部数据类型为int64,如果指定值为浮点数则创建的张量的默认内部数据类型为float32;torch.full_like()方法创建的张量中的内部数据类型与传入张量的内部数据类型一致。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐