教你如何使用PyTorch解决多分类问题

这篇具有很好参考价值的文章主要介绍了教你如何使用PyTorch解决多分类问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文分享自华为云社区《使用PyTorch解决多分类问题:构建、训练和评估深度学习模型》,作者: 小馒头学Python。

引言

当处理多分类问题时,PyTorch是一种非常有用的深度学习框架。在这篇博客中,我们将讨论如何使用PyTorch来解决多分类问题。我们将介绍多分类问题的基本概念,构建一个简单的多分类神经网络模型,并演示如何准备数据、训练模型和评估结果。

什么是多分类问题?

多分类问题是一种机器学习任务,其中目标是将输入数据分为多个不同的类别或标签。与二分类问题不同,多分类问题涉及到三个或更多类别的分类任务。例如,图像分类问题可以将图像分为不同的类别,如猫、狗、鸟等。

处理步骤

  • 准备数据:

收集和准备数据集,确保每个样本都有相应的标签,以指明其所属类别。

划分数据集为训练集、验证集和测试集,以便进行模型训练、调优和性能评估。

  • 数据预处理:

    对数据进行预处理,例如归一化、标准化、缺失值处理或数据增强,以确保模型训练的稳定性和性能。

  • 选择模型架构:

    选择适当的深度学习模型架构,通常包括卷积神经网络(CNN)、循环神经网络(RNN)、Transformer等,具体取决于问题的性质。

  • 定义损失函数:

    为多分类问题选择适当的损失函数,通常是交叉熵损失(Cross-Entropy Loss)。

  • 选择优化器:

    选择合适的优化算法,如随机梯度下降(SGD)、Adam、RMSprop等,以训练模型并调整权重。

  • 训练模型:

    使用训练数据集来训练模型。在每个训练迭代中,通过前向传播和反向传播来更新模型参数,以减小损失函数的值。

  • 评估模型:

    使用验证集来评估模型性能。常见的性能指标包括准确性、精确度、召回率、F1分数等。

  • 调优模型:

    根据验证集的性能,对模型进行调优,可以尝试不同的超参数设置、模型架构变化或数据增强策略。

  • 测试模型:

    最终,在独立的测试数据集上评估模型的性能,以获得最终性能评估。

  • 部署模型:

    将训练好的模型部署到实际应用中,用于实时或批处理多分类任务。

多分类问题

之前我们讨论的问题都是二分类居多,对于二分类问题,我们若求得p(0),南无p(1)=1-p(0),还是比较容易的,但是本节我们将引入多分类,那么我们所求得就转化为p(i)(i=1,2,3,4…),同时我们需要满足以上概率中每一个都大于0;且总和为1。

处理多分类问题,这里我们新引入了一个称为Softmax Layer

接下来我们一起讨论一下Softmax Layer层

首先我们计算指数计算e的zi次幂,原因很简单e的指数函数恒大于0;分母就是e的z1次幂+e的z2次幂+e的z3次幂…求和,这样所有的概率和就为1了。

下图形象的展示了Softmax,Exponent这里指指数,和上面我们说的一样,先求指数,这样有了分子,再将所有指数求和,最后一一divide,得到了每一个概率。

接下来我们一起来看看损失函数

如果使用numpy进行实现,根据刘二大人的代码,可以进行如下的实现

import numpy as np

y = np.array([1,0,0])

z = np.array([0.2,0.1,-0.1])

y_pred = np.exp(z)/np.exp(z).sum()

loss = (-y * np.log(y_pred)).sum()

print(loss)

运行结果如下

注意:神经网络的最后一层不需要激活

在pytorch中

import torch

y = torch.LongTensor([0]) # 长整型

z = torch.Tensor([[0.2, 0.1, -0.1]])

criterion = torch.nn.CrossEntropyLoss()

loss = criterion(z, y)

print(loss)

运行结果如下

下面根据一个例子进行演示

criterion = torch.nn.CrossEntropyLoss()

Y = torch.LongTensor([2,0,1])

Y_pred1 = torch.Tensor([[0.1, 0.2, 0.9],

[1.1, 0.1, 0.2],

[0.2, 2.1, 0.1]])

Y_pred2 = torch.Tensor([[0.8, 0.2, 0.3],

[0.2, 0.3, 0.5],

[0.2, 0.2, 0.5]])

l1 = criterion(Y_pred1, Y)

l2 = criterion(Y_pred2, Y)

print("Batch Loss1 = ", l1.data, "\nBatch Loss2=", l2.data)

运行结果如下

根据上面的代码可以看出第一个损失比第二个损失要小。原因很简单,想对于Y_pred1每一个预测的分类与Y是一致的,而Y_pred2则相差了一下,所以损失自然就大了些

MNIST dataset的实现

首先第一步还是导包

import torch

from torchvision import transforms

from torchvision import datasets

from torch.utils.data import DataLoader

import torch.nn.functional as F

import torch.optim as optim

之后是数据的准备

batch_size = 64

# transform可以将其转化为0-1,形状的转换从28×28转换为,1×28×28

transform = transforms.Compose([

transforms.ToTensor(),

transforms.Normalize((0.1307, ), (0.3081, )) # 均值mean和标准差std

])

train_dataset = datasets.MNIST(root='../dataset/mnist/',

train=True,

download=True,

transform=transform)

train_loader = DataLoader(train_dataset,

shuffle=True,

batch_size=batch_size)

test_dataset = datasets.MNIST(root='../dataset/mnist/',

train=False,

download=True,

transform=transform)

test_loader = DataLoader(test_dataset,

shuffle=False,

batch_size=batch_size)

接下来我们构建网络

class Net(torch.nn.Module):

def __init__(self):

super(Net, self).__init__()

self.l1 = torch.nn.Linear(784, 512)

self.l2 = torch.nn.Linear(512, 256)

self.l3 = torch.nn.Linear(256, 128)

self.l4 = torch.nn.Linear(128, 64)

self.l5 = torch.nn.Linear(64, 10)

def forward(self, x):

x = x.view(-1, 784)

x = F.relu(self.l1(x))

x = F.relu(self.l2(x))

x = F.relu(self.l3(x))

x = F.relu(self.l4(x))

return self.l5(x) # 注意最后一层不做激活

model = Net()

之后定义损失和优化器

criterion = torch.nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

接下来就进行训练了

def train(epoch):

running_loss = 0.0

for batch_idx, data in enumerate(train_loader, 0):

inputs, target = data

optimizer.zero_grad()

# forward + backward + update

outputs = model(inputs)

loss = criterion(outputs, target)

loss.backward()

optimizer.step()

running_loss += loss.item()

if batch_idx % 300 == 299:

print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))

running_loss = 0.0

def test():

correct = 0

total = 0

with torch.no_grad(): # 这里可以防止内嵌代码不会执行梯度

for data in test_loader:

images, labels = data

outputs = model(images)

_, predicted = torch.max(outputs.data, dim=1)

total += labels.size(0)

correct += (predicted == labels).sum().item()

print('Accuracy on test set: %d %%' % (100 * correct / total))

最后调用执行

if __name__ == '__main__':

for epoch in range(10):

train(epoch)

test()

NLLLoss 和 CrossEntropyLoss

NLLLoss 和 CrossEntropyLoss(也称为交叉熵损失)是深度学习中常用的两种损失函数,用于测量模型的输出与真实标签之间的差距,通常用于分类任务。它们有一些相似之处,但也有一些不同之处。

相同点:

用途:两者都用于分类任务,评估模型的输出和真实标签之间的差异,以便进行模型的训练和优化。

数学基础:NLLLoss 和 CrossEntropyLoss 本质上都是交叉熵损失的不同变种,它们都以信息论的概念为基础,衡量两个概率分布之间的相似度。

输入格式:它们通常期望模型的输出是一个概率分布,表示各个类别的预测概率,以及真实的标签。

不同点:

输入格式:NLLLoss 通常期望输入是对数概率(log probabilities),而 CrossEntropyLoss 通常期望输入是未经对数化的概率。在实际应用中,CrossEntropyLoss 通常与softmax操作结合使用,将原始模型输出转化为概率分布,而NLLLoss可以直接使用对数概率。

对数化:NLLLoss 要求将模型输出的概率经过对数化(取对数)以获得对数概率,然后与真实标签的离散概率分布进行比较。CrossEntropyLoss 通常在 softmax 操作之后直接使用未对数化的概率值与真实标签比较。

输出维度:NLLLoss 更通用,可以用于多种情况,包括多类别分类和序列生成等任务,因此需要更多的灵活性。CrossEntropyLoss 通常用于多类别分类任务。

总之,NLLLoss 和 CrossEntropyLoss 都用于分类任务,但它们在输入格式和使用上存在一些差异。通常,选择哪个损失函数取决于你的模型输出的格式以及任务的性质。如果你的模型输出已经是对数概率形式,通常使用NLLLoss,否则通常使用CrossEntropyLoss。

 文章来源地址https://www.toymoban.com/news/detail-747013.html

点击关注,第一时间了解华为云新鲜技术~

 

到了这里,关于教你如何使用PyTorch解决多分类问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑无法开机可能是硬盘出问题,教你如何解决

    随着电脑的普及和使用,硬盘故障成为了常见的电脑问题之一。当电脑无法开机时,硬盘故障是很有可能是导致问题的原因之一。本文将深入探讨电脑无法开机可能是硬盘出问题的原因及解决方案。 一、电脑无法开机可能是硬盘出问题的原因 1. 硬盘损坏:硬盘损坏是导致电

    2024年02月05日
    浏览(53)
  • 2023教你轻松解决blender使用常见问题

    当你使用 Blender 时,你会遇到很多困难的情况。无论您是专业动画师还是业余爱好者,重要的是要了解使用 Blender 时可能出现的常见问题。在今天的文章中, 为Blender用户 探索一些问题和解决方案。凭借正确的知识和一些实践,任何人都可以掌握动画艺术并使用 Blender创造令

    2024年02月11日
    浏览(59)
  • 解决win10下桌面右击新建没有文本文档(.txt)的问题

    新建reg.txt 双击打开

    2024年02月09日
    浏览(65)
  • Pytorch的安装教程,解决jupyter不能使用pytorch的问题

    一.Pytorch的安装教程:PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili 在anaconda prompt 提示符输入以下语句: 激活pytorch环境:conda activate pytorch 查看pytorch环境下安装了哪些包:pip list 检查pytorch安装成功:        python import torch print(torch.__version_

    2024年02月21日
    浏览(33)
  • 解决jupyter notebook可以使用pytorch而Pycharm不能使用pytorch的问题

    之前我是用的这个目录下的Python 改变virtualenv environment 1、  2、  3、 改变Conda Environment 第二天登录Pycharm发现 import  torch又标红了,以下是解决的操作步骤  点击Load Environments就可以解决了! 改变System Interpreter 那么以下是解决办法 点击file --setting   然后接着点击Project目录下

    2024年02月10日
    浏览(64)
  • 教你一步解决大部分wallpaper engine使用时卡顿、鼠标延迟的问题

    解决方法: 在英伟达的Geforce Experience里点击设置,如果不知道怎么进,只需要搜索Experience就可以了 将里面的“在游戏内覆盖”勾选去掉即可 OK,解决了

    2024年02月15日
    浏览(367)
  • 解决DCNv2不能使用高版本pytorch编译的问题

    可变形卷积网络GitHub - CharlesShang/DCNv2: Deformable Convolutional Networks v2 with Pytorch代码已经出来好几年了,虽然声称\\\"Now the master branch is for pytorch 1.x\\\",实际上由于pytorch自1.11版开始发生了很大变化,原来基于C实现的THC封装实现的调用cuda、cudnn和cublas的API(只能用NVIDIA的GPU)被基于C++实

    2024年02月09日
    浏览(38)
  • 手把手教你使用Hexo+GitHub搭建个人博客并发布文章(附常见问题解决方法)

    本教程使用GitHub自带的GitHub pages来生成静态个人博客,而Hexo可以更换各种好看的主题,而且都是免费的,花一点时间就可以打造出自己独有的个人博客。 Hexo这个有力的工具可以让我们专注于写出一篇博客而不需要关心如何编写html和CSS,再如何形成一个网站,它可以根据ma

    2024年02月04日
    浏览(63)
  • 【AI】《动手学-深度学习-PyTorch版》笔记(十一):分类问题-softmax回归

    1)连续值与离散值 线性回归模型,适用于输出为连续值的情景。 softmax回归模型,适用于输出为离散值的情景。例如图像类别,就需要对离散值进行预测。softmax回归模型引入了softmax运算,使输出更适合离散值的预测和训练。 2)输出个数 线性回归模型,输出单元为1个,而

    2024年02月14日
    浏览(74)
  • 如何使用腾讯会议录屏?腾讯会议不允许录屏怎么办?这个方法教你解决

    ​近年来,线上活动越来越活跃,很多人都开始使用腾讯会议进行开会、网课教学等活动。很多人希望使用腾讯会议进行录屏。那么如何使用腾讯会议录屏?腾讯会议不允许录屏怎么办?这个方法教你解决!   很多人使用腾讯会议作为网上会议、网课教学的选择。那么腾讯会

    2024年02月09日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包