带你从入门到精通——深度学习(一. 深度学习简介和PyTorch入门)
深度学习(也被称为仿生物脑)是机器学习中的一种特殊方法,它使用被称为神经网络(也被称为仿生物神经元)的复杂结构,特别是“深层”的神经网络,来学习和做出预测。深度学习特别适合处理大规模和高维度的数据,例如图像、声音和文本。深度学习的精度高,性能优于其他的机器学习算法,甚至在某些领域超过了人类,并且随着计算机硬件的发展,可以近似任意的非线性函数。但深度学习是一种“黑箱”模型,很难解释模型的工作机制,并
目录
一. 深度学习简介和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()方法创建的张量中的内部数据类型与传入张量的内部数据类型一致。
更多推荐
所有评论(0)