status
type
date
slug
summary
tags
category
password
icon
Total Videos
Link
Video Duration

什么是PyTorch

PyTorch是一个开源的机器学习框架,有两个特性:
  • 可以在GPU上进行N维Tensor(张量)的运算
  • 用于训练深度神经网络的自动微分

Tensor

数据类型

Tensor与numpy的ndarray类似,就是高维矩阵。一下是Tensor的数据类型和函数调用。
Data type
dtype
tensor
32-bit floating point
torch.float
torch.FloatTensor
64-bit integer (signed)
torch.tong
torch.LongTensor

Tensor的形状

notion image
PyTorch的dim和NumPy的axis是一个意思,都是用来表示维度的。

构建Tensor

Tensor常见函数

  • Squeeze:把Tensor中的一个维度给拿掉(降维打击)
  • Unsqueeze:添加一个新维度
  • Transpose:将矩阵指定的两个维度对调,对应线性代数的转置矩阵
  • Cat:在指定维度连接多个Tensor
更多函数请看文档
PyTorch和NumPy常用函数的对比请看文档
pytorch-for-numpy-users
wkentaroUpdated Sep 5, 2024

Tensor要求

Tensor默认下会在cpu上运行,为了加快速度,我们可以指定Tensor使用GPU,只需使用x=x.to('cuda')
CUDA是N卡专用的计算平台,使用CUDA能大大加速计算过程。矩阵

怎么计算Gradient

notion image

深度神经网络(DNN)训练过程

notion image

训练神经网络

对应机器学习的三个主要步骤,需要完成:
  1. 确定类神经网络架构,也就是Model,如CNN,RNN。也就是设定范围。
  1. 定义Loss函数,也就是设定标准。
  1. 找出最优演算法,也就是达成目标。

测试神经网络

通过不断的Training和validation找出最好的Testing。

Dataset和Dataloader

  • Dataset:用于存储数据样本和期望值。
  • Dataloader:批量对数据进行分组,启用多重处理。
一段基本的Dataset代码
上面这段代码首先创建了一个名为dataset的数据集对象,参数为file。然后使用这个数据集创建了一个名为dataloader的数据加载器对象,参数为dataset、batch_size和shuffle=True。这个数据加载器可以用来批量加载数据并且可以对数据进行随机打乱。
  • dataset: 这个参数指定了要被加载的数据集对象,包含了模型训练所需的样本数据。
  • batch_size: 这个参数指定了每个批次中包含的样本数量。在训练过程中,数据通常会被分成批次进行处理,batch_size就决定了每个批次中有多少个样本。
  • shuffle: 这个参数用来指定是否在每个epoch开始时对数据进行随机打乱。设置为True时,数据加载器会在每个epoch开始时随机打乱数据,有助于模型更好地学习数据的特征;而测试时,我们会把shuffle设置为False,
notion image
dataloader通过使用getitem()方法获取的Dataset数据,将这些数据打包成一组数据的大小就是mini-batch,对应dataloader()的batch_size参数
 

torch.nn——神经网络层

线性层(FuIIy-connected Layer) 是神经网络中的一种基本层,它通过将输入数据与权重相乘并加上偏置来实现对输入数据的线性变换。这种层的特点是每个输入神经元都与输出神经元相连,即每个输入维度都会影响输出的所有维度。
使用方法:nn.Linear(in_features, out_features) 此方法用于创建一个全连接层其中in_features参数指定输入特征的数量,out_features参数指定输出特征的数量。
注意:in_featuresout_features 的前面的参数可以是任意维度,但最后一个维度必须为32和64
线性层的数学表达式可以表示为,具中是输入张量,是权重矩阵, 是偏置向量。这个表达式描述了如何诵过线性变换将输入数据转换为输出数据的过程。在这个过程中,权重矩阵和偏置向量 共同决定了线性层的输出。
notion image
如图in_features 参数也就是为32维,out_features 参数也就是是64维,我们通过权重矩阵,对进行转置,然后加上偏置向量,即可得到64维的
要查看矩阵参数只需要使用以下代码:
此外,线性层还可以用于分类任务,例如使用线性分类器对数据进行二元或多类分类。总的来说,线性层是构建深度学习模型的基础组件之一,它通过简单的线性变换来处理输入数据,为后续的非线性处理提供基础。

torch.nn——激活函数

  • Sigmoid Activation 使用方法:nn.Sigmoid() 它将输入值压缩到0到1之间,常用于输出层,用于二分类问题。
  • ReLU Activation 使用方法:nn.ReLU() 它在输入值大于0时返回输入值本身,在小于等于0时返回0,常用于隐藏层,能够有效地解决梯度消失问题。
这两种激活函数在神经网络中被广泛应用,能够增强网络的非线性表达能力。
💡
激活函数通常用于神经网络的隐藏层,对输入信号进行非线性变换,帮助网络学习复杂的模式和特征。它的作用在于增加神经网络的表达能力,使其能够适应更多不同类型的数据。
相比之下,nn.Linear()函数是用于定义神经网络中的线性变换层,将输入的数据进行线性变换和加权求和。它负责对输入数据进行线性变换,而不具备激活函数引入的非线性变换。因此,激活函数和nn.Linear()函数在神经网络中扮演着不同的角色:前者引入非线性特征,后者进行线性变换。

torch.nn——Loss函数

  • Mean Squared Error (均方误差损失函数) 使用方法:nn.MSELoss() 这个函数通常被用于线性回归模型中,用来衡量模型预测值和实际值之间的差异。在这行代码中,nn.MSELoss()创建了一个均方误差损失函数的实例,可以用来计算模型预测值和实际值之间的均方误差。
  • Cross Entropy (交叉熵) 使用方法:nn.CrossEntropyLoss() 这是一种损失函数,可用于评估分类模型的性能。它将模型预测的类别概率分布与实际类别之间的差异作为损失进行计算,并且在训练过程中,通过最小化交叉熵损失来优化模型,使其能够更好地分类输入数据。

torch.nn——构建你自己的神经网络

定义的神经网络结构
定义的神经网络结构
这段代码定义了一个简单的神经网络模型。首先导入了PyTorch的神经网络模块(nn)。然后定义了一个叫做MyModel的类,它继承自nn.Module类。在类的初始化函数中,使用super函数调用父类的初始化方法,然后定义了一个神经网络结构,使用了nn.Sequential()容器将三个层组合在一起。其中包括一个输入为10维,输出为32维的线性层,一个Sigmoid激活函数,以及一个输入为32维,输出为1维的线性层。
在forward函数中,定义了模型的前馈计算,也就是模型的正向传播过程。这个函数接受输入x,并将其传递给之前定义的神经网络结构self.net,然后返回其结果。
这个模型用于输入大小为10的向量,输出一个值。

torch.optim——最优化算法

torch.optim是PyTorch的神经网络优化算法模块,提供了各种优化算法。Stochastic Gradient Descent (SGD)——随机梯度下降是其中之一。
使用方法:torch.optim.SGD(params, lr, momentum = 0) 其中参数 params 是需要优化的参数,lr是学习率,而 momentum 是动量因子,默认为0。SGD 是一种常用的优化算法,通过不断迭代更新参数,以最小化损失函数,从而训练神经网络模型。

神经网络训练

神经网络评估(验证集)

在训练神经网络时,通常需要将数据集分为训练集、验证集和测试集。验证集用于评估模型的性能,帮助我们了解模型的泛化能力和准确性。通过对验证集的评估结果,我们可以调整模型的参数,以提高其性能,避免过拟合。因此神经网络的验证集评估对于优化模型和改进其表现至关重要。

神经网络评估 (测试集)

model.eval(),torch.no_grad()

  • model.eval():用于改变一些模型层的行为,因为有些模型在训练和测试的时候做的事情是不一样的,所以要切换行为,比如dropout和batchnormalization。
  • with torch.no_grad():防止梯度计算修改模型参数。通常用于防止在验证/测试数据上意外进行训练,且能加快计算速度。

保存和载入模型

  • 保存 torch.save(model.state_dict(), path)
  • 加载 ckpt = torch.load(path) model.load_state_dict(ckpt)
1.5Google Colab Tutorial1.3深度学习基本概念(下)
Loading...