脚本宝典收集整理的这篇文章主要介绍了使用PyTorch进行深度学习任务的主要流程,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
完成一项机器学习任务时的步骤:
深度学习和机器学习的差异:
import os
import numpy as np
import torch
import torch.nn as nn
From torch.utils.data import Dataset, DataLoader
import torch.optim as optimizer
batch_size = 16 # batch中的样本数
lr = 1e-4 # 初始学习率
max_epochs = 100 # 训练次数
# 方案一:使用x,这种情况如果使用GPU不需要设置
os.environ['CUDA_VISIBLE_DEVICES'] = '1' # Only device 1 will be seen
os.environ['CUDA_VISIBLE_DEVICES'] = '0,1' # Devices 0 and 1 will be visible
# 方案二:使用“device”,后续对要使用GPU的变量用.to(device)即可
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
1.直接使用PyTorch仓库中准备好的数据
FashionMNIST 是一个替代 MNIST 手写数字 的图像数据集
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor()
)
root
:训练/测试数据的存储路径train
:强调是训练集还是测试集download=True
:如果根路径的数据不可用,就从互联网下载数据transform
and target_transform
:指定特征和标签的转换2.自定义dataset类进行数据的读取以及初始化
__inIT__
: 用于向类中传入外部参数,同时定义样本集__getitem__
: 用于逐个读取样本集合中的元素,可以进行一定的变换,并将返回训练/验证所需的数据__len__
: 用于返回数据集的样本数DataLoader使用iterative的方式不断读入批次数据
train_loader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, num_workers=4, shuffle=True, drop_last=True)
PyTorch中神经网络构造一般是基于 Module 类的模型来完成的,它让模型构造更加灵活。
Module 类是 nn 模块里提供的一个模型构造类,是所有神经网络模块的基类,我们可以继承它来定义我们想要的模型。
下面为继承 Module 类构造多层感知机的示例。这里定义的 MLP 类重载了 Module 类的 init 函数和 forward 函数。它们分别用于创建模型参数和定义前向计算(正向传播)。
import torch
from torch import nn
class MLP(nn.Module):
# 声明带有模型参数的层,这里声明了两个全连接层
def __init__(self, **kwargs):
# 调用MLP父类Block的构造函数来进行必要的初始化。这样在构造实例例时还可以指定其他函数
suPEr(MLP, self).__init__(**kwargs)
self.hidden = nn.Linear(784, 256)
self.act = nn.ReLU()
self.output = nn.Linear(256,10)
# 定义模型的前向计算,即如何根据输入x计算返回所需要的模型输出
def forward(self, x):
o = self.act(self.hidden(x))
return self.output(o)
深度学习的一个魅力在于神经网络中各式各样的层,例如全连接层、卷积层、池化层与循环层等等。虽然PyTorch提供了大量常用的层,但有时候我们依然希望自定义层。
下面是使用 Module 来自定义层,从而可以被反复调用的示例:
不含模型参数的层
import torch
from torch import nn
class MyLayer(nn.Module):
def __init__(self, **kwargs):
super(MyLayer, self).__init__(**kwargs)
def forward(self, x):
return x - x.mean()
含模型参数的层
Parameter 类其实是 Tensor 的子类,如果一 个 Tensor 是 Parameter,那么它会自动被添加到模型的参数列表里。所以在自定义含模型参数的层时,我们应该将参数定义成 Parameter,除了直接定义成 Parameter 类外,还可以使用ParameterList 和 ParameterDict 分别定义参数的列表和字典。
class MyListDense(nn.Module):
def __init__(self):
super(MyListDense, self).__init__()
self.params = nn.ParameterList([nn.Parameter(torch.randn(4, 4)) for i in range(3)])
self.params.append(nn.Parameter(torch.randn(4, 1)))
def forward(self, x):
for i in range(len(self.params)):
x = torch.mm(x, self.params[i])
return x
net = MyListDense()
PRint(net)
二维卷积层
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。在训练模型的时候,通常我们先对卷积核随机初始化,然后不不断迭代卷积核和偏差。
池化层
池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。
损失函数 | 功能 | 代码 |
---|---|---|
二分类交叉熵损失函数 | 计算二分类任务时的交叉熵(Cross Entropy)函数。 | torch.nn.BCELoss() |
交叉熵损失函数 | 计算交叉熵的函数。 | torch.nn.CrossEntropyLoss() |
L1损失函数 | 计算输出y 和真实标签target 之间的差值的绝对值。 |
torch.nn.L1Loss() |
MSE损失函数 | 计算输出y 和真实标签target 之差的平方。 |
torch.nn.MSELoss() |
平滑L1 (Smooth L1)损失函数 | L1的平滑输出,其功能是减轻离群点带来的影响。 | torch.nn.SmoothL1Loss() |
目标泊松分布的负对数似然损失函数 | 泊松分布的负对数似然损失函数。 | torch.nn.PoissonNLLLoss() |
KL散度 | 计算相对熵。用于连续分布的距离度量,并且对离散采用的连续输出空间分布进行回归通常很有用。 | torch.nn.KLDivLoss() |
MarginRankingLoss | 计算两个向量之间的相似度,用于排序任务。该方法计算两组数据之间的差异。 | torch.nn.MarginRankingLoss() |
多标签边界损失函数 | 对于多标签分类问题计算损失函数。 | torch.nn.MultiLabelMarginLoss() |
二分类损失函数 | 计算二分类的 LOGistic 损失。 | torch.nn.SoftMarginLoss() |
多分类的折页损失 | 计算多分类的折页损失。 | torch.nn.MultiMarginLoss() |
三元组损失 | 计算三元组损失。 | torch.nn.TripletMarginLoss() |
HingEmbeddingLoss | 对输出的embedding结果做Hing损失计算。 | torch.nn.HingeEmbeddingLoss() |
余弦相似度 | 对于两个向量做余弦相似度损失计算。 | torch.nn.CosineEmbeddingLoss() |
CTC损失函数 | 用于解决时序类数据的分类。计算连续时间序列和目标序列之间的损失。 | torch.nn.CTCLoss() |
优化器就是根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值,使得模型输出更加接近真实标签。
Pytorch提供的优化器库torch.optim:
torch.optim.ASGD
torch.optim.Adadelta
torch.optim.Adagrad
torch.optim.Adam
torch.optim.AdamW
torch.optim.Adamax
torch.optim.LBFGS
torch.optim.RMSprop
torch.optim.Rprop
torch.optim.SGD
torch.optim.SparseAdam
优化器的选择是需要根据模型进行改变的,不存在绝对的好坏之分,需要多进行一些测试。
在PyTorch中设置模型状态:
model.train() # 训练状态
model.eval() # 验证/测试状态
用for循环读取DataLoader中的全部数据。
for data, label in train_loader:
之后将数据放到GPU上用于后续计算,此处以.cuda()为例
data, label = data.cuda(), label.cuda()
开始用当前批次数据做训练时,应当先将优化器的梯度置零:
optimizer.zero_grad()
之后将data送入模型中训练:
output = model(data)
根据预先定义的criterion计算损失函数:
loss = criterion(output, label)
将loss反向传播回网络:
loss.backward()
使用优化器更新模型参数:
optimizer.step()
这样一个训练过程就完成了,后续还可以计算模型准确率等指标。
验证/测试的流程基本与训练过程一致,不同点在于:
某些任务在训练完成后,需要对一些必要的内容进行可视化,比如分类的ROC曲线,卷积网络中的卷积核,以及训练/验证过程的损失函数曲线等。
参考链接:
以上是脚本宝典为你收集整理的使用PyTorch进行深度学习任务的主要流程全部内容,希望文章能够帮你解决使用PyTorch进行深度学习任务的主要流程所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。