使用PyTorch解决多分类问题:构建、训练和评估深度学习模型

二、PyTorch分类任务建模示例 import torch # ^^^ pyforest auto-imports - don't write above this line 分类问题的分类:二分类:目标是两个选项之一,例子:是否患有心脏病多分类:目标可以是两个以上选项之一,例子:是食物,人,还是狗。多标签分类:可以为目标分配多个选项。预测一本书:分配到哪些类别:(数学、科学和哲学) 阅读详情
AI摘要

本文详细介绍了如何使用PyTorch处理多分类问题,包括概念解释、数据准备、模型构建(如SoftmaxLayer和CrossEntropyLoss)、MNIST数据集应用、损失函数选择和训练过程。,

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!
请添加图片描述

🍋引言

当处理多分类问题时,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。

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

深度学习模型系列一——多分类模型——Softmax 回归 Softmax 回归1、概述 1、概述 softmax 回归(softmax regression)其实是 logistic 回归的一般形式,logistic 回归用于二分类,而 softmax 回归用于多分类,关于 logistic 回归可以看我的这篇博客????机器学习笔记九——线性模型原理以及python实现案例 参考资料: https://blog.youkuaiyun.com/weixin_38169413/article/details/103598534 ... 阅读详情

相关推荐

基于python构建医学图像的多分类模型

适配医学影像数据的加载与标注解析,解决图像与标签文件(JSON)的对应问题。核心逻辑路径匹配:遍历{root_dir}/{mode}/{class_name}目录(mode为train或test,class_name为病变程度),检查图像(.jpg/.png)与同名的JSON标注文件是否存在。样本生成:仅当图像和标注文件同时存在时,才将该样本加入训练/测试集(避免无效数据干扰)。

qq_42679807的博客 2254

【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)

【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)

takedachia的博客 4188

基于 PyTorch 的深度学习模型开发实战

本教程介绍了使用 PyTorch 进行深度学习模型开发的全过程,从环境搭建、数据预处理、模型构建、训练与优化、评估以及部署。本教程将通过一个完整的深度学习模型开发流程,从数据预处理、模型构建、训练与优化、评估以及部署,帮助读者深入理解深度学习的关键技术,并通过实战案例掌握 PyTorch 的应用。未来,随着深度学习技术的不断发展,更多先进的模型架构(如 Transformer、Diffusion Model)将不断涌现,掌握这些前沿技术将有助于解决更复杂的实际问题。

qq_20245171的博客 1449

使用pytorch训练你自己的图像分类模型(包括模型训练、推理预测、误差分析)

待完成

胖胖大海的博客 1万+

Pytorch搭建常见分类网络模型------VGG、Googlenet、ResNet50 、MobileNetV2(2)

接上一节内容:Pytorch搭建常见分类网络模型------VGG、Googlenet、 MobileNetV3、ResNet50(1)_一只小小的土拨鼠的博客-优快云博客 前言:AlexNet、VGG等经典的神经网络框架,一个共同特点是:整个网络由不同神经模块的串联构建。神经网络深度不断加深会造成过拟合和模型参数巨大等问题。解决主要方法是引入稀疏特性、将全连接层换成稀疏连接。Googlenet串并联网络结构便是由此提出。 在串联网络中,每一层级的卷积核都是固定尺寸的,只能提取固定尺度的特征。基于这种

3877

【光学仿真】基于Matlab的LG/BG/PV/HG光束生成与特性分析【附完整源码】

本文详细介绍了如何使用Matlab进行拉盖尔-高斯(LG)、贝塞尔-高斯(BG)、完美涡旋(PV)和厄米-高斯(HG)四种特殊光束的仿真与特性分析。通过提供完整的Matlab源码,手把手指导读者生成光束、分析其强度、相位、传播特性及轨道角动量,为光学研究、激光应用及教学提供了直观高效的数值实验平台。

3a9bq4r8t2y的博客 492

使用PyTorch实现多分类问题的深度学习模型

本项目展示了如何使用PyTorch框架构建和训练一个多分类深度学习模型。项目采用模块化设计,实现了完整的数据处理流程、灵活的模型架构和全面的训练评估系统。主要技术特点包括:数据标准化处理、多层神经网络设计、批量训练机制、早停策略等。通过实验验证,模型在测试集上取得了良好的分类效果,准确率达到85%以上。

LChuck的博客 1241

几款支持国标GB28181的平台以及视频监控设备接入的配置方法(Web端无插件播放)

GB28181解决的一个主要问题就是如何远程、跨网络、跨区域、跨级别的访问网络中的监控设备(包括IPC、NVR等),本文介绍几款G28181平台的接入配置方法,适合有监控视频摄像头的远程接入和预览需求的人群参考使用。

一名高级工程师的博客 1万+

深度学习-Pytorch如何构建和训练模型

用pytorch如何构建模型,如何训练模型,如何测试模型? pytorch 目前在深度学习具有重要的地位,比起早先的caffe,tensorflow,keras越来越受到欢迎,其他的深度学习框架越来越显得小众。

Alex_StarSky的博客 1586

KEGG数据库与KAAS工具:基因功能注释的实用指南

本文提供了使用KEGG数据库与KAAS工具进行基因功能注释的完整实用指南。详细阐述了如何从准备基因或蛋白序列开始,通过KAAS服务器获取KEGG Orthology(KO)编号,并解读注释结果。文章进一步介绍了如何利用KOBAS工具进行通路富集分析,将定性观察转化为定量洞察,并分享了提高注释准确率、处理大数据集及使用API等避坑技巧与高阶方法,为基因组学、转录组学研究者奠定坚实的数据分析基础。

weixin_29292535的博客 390

利用腾讯云轻量服务器快速搭建网站CDN

腾讯云的轻量最近在主机和站长中间可谓是占尽来风头,优秀的线路,低廉的价格使得越来越多的人开始使用腾讯云的轻量级服务器来部署应用。由于腾讯云轻量服务器的海外服务器电信走的是CN2GIA线路带宽30m挺适合做CDN的,我就记录一下如何利用腾讯云香港的轻量服务器搭建一个CDN。 购买服务器 首先选购服务器,最近腾讯云在做活动,力度很大国内备案用户可以选用国内的服务器最低128元/年,未备案的可以选用香港或者新加坡的服务器。 购买链接 服务器系统选Debian、Ubuntu、centos都可以 一键脚

demo_top的博客 2565

pytorch深度学习实践3——多分类问题,卷积神经网络CNN

多分类问题Softmax Classifier分类器 全连接网络:用线性层将网络连接在一起 softmax数学原理: loss函数实现方法: 交叉熵损失: 手写数字识别分类案例代码: 引入的包和库: 将图像转换为pytorch的tensor 将图像归一化为0-1分布 将transforms运用到dataset中: 构建模型: 定义损失函数和优化器: 训练: 卷积神经网...

qq_42832272的博客 1万+

安装esxi7.0

保存重启后就能安装。vCenter Server是VMware vSphere虚拟化架构中的核心管理工具,充当ESXi主机及虚拟机中心管理点的服务,利用vCenter Server,可以集中管理多ESXi主机及其虚拟机,安装、配置和管理vCenter Server 不当可能会导致管理效率降低,或者致使EXSi主机和虚拟机停用。提示选择安装VMware ESXi 使用的存储,ESXi支持U盘以及SD卡安装,如系统中存在多块存储设备,选择需要安装系统的磁盘【注意磁盘142G,ESXI会将120G做VMFSL】

u011220233的博客 1万+

深度学习——多分类问题(SOFTMAX MNIST)-学习笔记

深度学习——多分类问题 在深度学习里有个经典的数据集MNIST-dataset,它是一个手写的数字照片集合,也是一个经典的做多分类的一个集合。 这个集合是由0~9 10个数组成的集合,我们需求是分析输入的数字对应真实数字的概率是多少,说明需要十个标签,十个分类。 多分类问题 逻辑图 把原来只有一个输出,加到10个每个输出对应一个数字,这样可以得到每个数字对应的概率值,这里每个输出做的都是sigmoid二分类(即是非1即0),所以只要有一项输出为1时,其他非1的输出...

qq_58152527的博客 1万+

ExoPlayer硬解码实战:如何绕过系统默认软解码提升播放性能(附完整代码)

本文深入剖析了ExoPlayer默认解码器选择机制的不确定性,并提供了通过自定义MediaCodecSelector强制启用硬解码的完整实战方案。该方案能有效解决因软解码导致的播放卡顿、黑屏花屏及高功耗问题,显著提升Android应用在各种设备上的视频播放性能与稳定性。

weixin_29295541的博客 456

CUDA系列-Stream-1

This section describes static aspects of the CUSW_UNIT_STREAM unit’s architecture.和stream相关的其它Unit主要有Channel,Sync,Memmgr A CUDA stream is a software FIFO queue that allows commands like kernel launch and memcpy to be enqueued in it. The enqueued commands

weixin_43360707的博客 734

如何在模型训练中同时使用PyTorch和TensorFlow

引用自:机器之心:一行代码切换TensorFlow与PyTorch,模型训练也能用俩框架 你是否有时要用 PyTorch,有时又要跑 TensorFlow?这个项目就是你需要的,你可以在训练中同时使用两个框架,并端到端地转换模型。也就是说 TensorFlow 写的计算图可以作为某个函数,直接应用到 Torch 的张量上,这操作也是很厉害了。 在早两天开源的 TfPyTh 中,不论是 TensorFlow 还是 PyTorch 计算图,它们都可以包装成一个可微函数,并在另一个框架中高效完成前向与反向传播。很

weixin_41797870的博客 1万+

在lio_sam中融入GPS

在LIO(激光惯性里程计)系统中,将GPS信息融合到里程计中,借助GTSAM(Georgia Tech Smoothing and Mapping)库进行因子图优化,可以有效提升全局定位精度。当进入到GPS信号不好或缺失的环境中,需要借助融合后的里程计反算经纬度,来获取高精度的定位信息。利用GeographicLib第三方库将经纬度投影到局部笛卡尔坐标系中。

如果想成为中心,那么就到中心去吧。 1211

深度学习笔记——pytorch解决多分类问题 Multi-Class Classification

B站刘二大人《pytorch深度学习实践》

weixin_45978839的博客 1680

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

本文介绍多分类问题的基本概念,构建一个简单的多分类神经网络模型,并演示如何准备数据、训练模型和评估结果。

华为云官方博客 955

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pytorch使用matplotlib和tensorboard实现模型和训练的可视化

pytorch构建和训练深度学习模型的过程中,往往需要能够直观的观测到可视化的过程,比如画出训练曲线等。 对于简单的曲线绘制可以使用matplotlib库做出基本的图,如果需要更加高级的可视化过程,pytorch有好几个工具都可以做到,比如tensorwatch,visdom,tensorboard,实测下来发现tensorboard用起来比较方便和成熟稳定。 (pytorch自从1.2版本依赖就正式支持了独立的tensorboard,不再需要去安装tensorboardX了) 本文通过简单线性模型训

踏莎行的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

使用PyTorch实现回归问题的深度学习模型

本文详细介绍了如何使用PyTorch框架构建和训练一个用于解决回归问题的深度学习模型。文章采用循序渐进的方式,从数据准备到模型评估,完整展示了深度学习模型的开发流程。主要内容包括:使用scikit-learn生成模拟数据、实现数据标准化、创建自定义数据集、构建三层神经网络模型、实现带有早停机制的训练过程,以及结果可视化。通过本文的实践,读者可以掌握使用PyTorch开发深度学习模型的基本技能,了解回归问题的解决方案,以及模型训练中的关键技术点。

LChuck的博客 1513

PyTorch——深度学习多分类问题

pytorch深度学习关于手写数字识别多分类问题代码解析

weixin_42603976的博客 2418

【PyTorch】深度学习实践之 用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集)

用Softmax和CrossEntroyLoss解决多分类问题(Minst数据集),kaggle赛题商品分类

zoetu 3037

Pytorch深度学习笔记(十)多分类问题

之前,在中我们提到了二分类任务,现在我们讨论多分类问题。

qq_45981086的博客 3314

【深度学习】Pytorch:CUDA 模型训练

在深度学习中,GPU 的强大计算能力能极大地提升模型训练的速度。PyTorch 提供了对 CUDA(Compute Unified Device Architecture)的原生支持,使得在 GPU 上运行深度学习模型变得简单高效。本文将详细讲解如何使用 PyTorch 在 CUDA 上训练模型,并解析背后的原理与注意事项。

2303_80346267的博客 2489
上一篇: 使用PyTorch加载数据集:简单指南
下一篇: 问题:ProxyError: Conda cannot proceed due to an error in your proxy configuration.
小馒头学python
小馒头学python 优质创作者: python技术领域 优质创作者: python技术领域
博客等级 码龄4年 1万+粉丝 252原创
评论 74
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小馒头学python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值