当前位置: 首页 > news >正文

深度学习-多分类

在这里插入图片描述

文章目录

    • 多分类
    • one_hot编码
      • 编码原理
    • 交叉熵损失函数
      • 示例
    • 实战案例基于mnnist的手写识别
      • TensorBoard的使用
      • 部分代码解释

多分类

  • 输出是每个类别的概率,要求有多少个分类最终的输出层就有多少个神经元
  • 各分类输出概率的总和是1(使用softmax归一化)
    在这里插入图片描述

one_hot编码

One-Hot 编码是机器学习中处理​​分类数据​​的核心技术,它将离散类别转换为向量表示,使其能被神经网络处理。

一句话:在一个样本中:n个分类,结果是第k个,则yone-hot=[0,⋯,1⏟第k位,⋯,0]y_{\text{one-hot}} = [0, \cdots, \underbrace{1}_{\text{第k位}}, \cdots, 0]yone-hot=[0,,k1,,0]

编码原理

对于一个包含 C 个类别的特征:

  • 创建长度为 C 的零向量
  • 对第 k 类数据,将其向量中第 k 个位置设为 1
  • 其余位置保持为 0

yone-hot=[0,⋯,1⏟第k位,⋯,0]y_{\text{one-hot}} = [0, \cdots, \underbrace{1}_{\text{第k位}}, \cdots, 0]yone-hot=[0,,k1,,0]

假设动物分类的类别为:[“狗”, “猫”, “鸟”]
类别 One-Hot 编码
狗 [1, 0, 0]
猫 [0, 1, 0]
鸟 [0, 0, 1]

交叉熵损失函数

一句话:在H(y,pi)=−∑xylog⁡piH(y,p_i)=-\sum_{x}y\log p_iH(y,pi)=xylogpi中,只有一条1*log(pi)为最终交叉熵损失函数值,其它都是0*log(pi)=0

交叉熵损失函数与逻辑回归中的损失函数效果相同,都是为如何调整参数指明方向,即通过求取梯度,调整参数使损失函数的值逼近0,只是交叉熵损失函数用在多分类中
L(y^,y)=−ylog⁡(y^)−(1−y)log⁡(1−y^)L(\hat{y}, y) = - y \log(\hat{y}) - (1 - y) \log(1 - \hat{y}) L(y^,y)=ylog(y^)(1y)log(1y^)

交叉熵损失函数
H(y,pi)=−∑xylog⁡piH(y,p_i)=-\sum_{x}y\log p_iH(y,pi)=xylogpi

yi:是真实标签(真实分布),通常采用one−hot编码(真实类别为1,其余为0)y_i:是真实标签(真实分布),通常采用one-hot编码(真实类别为1,其余为0)yi:是真实标签(真实分布),通常采用onehot编码(真实类别为1,其余为0
(乘的时候按类,分开乘了,0*log or 1*log ,单个样本,最终结果取决于那个唯一的1*log的值)

pi:是预测概率(模型输出的概率分布)p_i:是预测概率(模型输出的概率分布)pi:是预测概率(模型输出的概率分布)

log⁡(pi):是预测概率的对数值\log(p_i):是预测概率的对数值log(pi):是预测概率的对数值

整体计算:是真实标签yi与预测概率对数log⁡(pi)的乘积再求和取负整体计算:是真实标签y_i与预测概率对数\log(p_i)的乘积再求和取负整体计算:是真实标签yi与预测概率对数log(pi)的乘积再求和取负

示例

在这里插入图片描述

  • L=0.357 表示当前预测不够准确(理想值应接近0)
  • Log的底数无所谓,经过训练,任何底数的结果都是相同的

log(x)
在这里插入图片描述

实战案例基于mnnist的手写识别

TensorBoard的使用

from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter(comment='test_tensorboard')  # 用于记录要可视化的数据
#writer = SummaryWriter(存放的地址)

如果不指定绝对路径,PyTorch 默认创建runs在当前文件夹下
在这里插入图片描述

在你安装TensorBoard的虚拟py环境中运行以下代码即可

tensorboard --logdir="这个event文件所在目录的绝对地址"

在这里插入图片描述
在这里插入图片描述

部分代码解释

import torch
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from torchvision.datasets import MNIST
import matplotlib.pyplot as plt
import os
import numpy as np
from datetime import datetime
import os
log_dir = "runs"
os.makedirs(log_dir, exist_ok=True)

创建一个名为runs的文件夹

import matplotlib.pyplot as plt
writer = SummaryWriter(log_dir=log_subdir)

记录数据便于后续画图

3.定义网络基本框架

class SoftmaxRegression(torch.nn.Module):#括号中的 torch.nn.Module 表示你的 SoftmaxRegression 类 继承自 PyTorch 的 Module 基类def __init__(self):  #self 指代 当前类的实例对象(即正在创建的具体模型)super().__init__()# 单层网络结构:784输入 -> 10输出self.linear = torch.nn.Linear(28 * 28, 10)#定义了这个网络的基本结构,有784个输入特征,10个输出def forward(self, x):# 应用log_softmax到线性层输出return torch.nn.functional.log_softmax(self.linear(x), dim=1)

log_softmax(self.linear(x), dim=1)相当于两步
softmax_output = exp(z_i) / sum(exp(z_j)) # 转换为概率分布
log_softmax = log(softmax_output) # 取自然对数

torch.nn.functional.log_softmax(self.linear(x), dim=1),dim=1
im=0:跨样本操作(通常不需要)(每个样本的第n类概率加起来为1)
dim=1:跨类别操作(分类任务的标准做法)(每个样本的n个类的各个概率加起来为1)

在这个模型中没有隐藏层,这是一个单层神经网络(也称为 Softmax 回归或多元逻辑回归),是直接从784个输出特征到,输出层的十个输出神经元

线性变换-神经元a0
线性变换-神经元a1
1......1
线性变换-神经元a9
输入的784个特征x
激活函数log_softmax(z)

4.加载训练数据

def get_data_loader(is_train, batch_size=128):transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))  # MNIST的均值和标准差])dataset = MNIST(root='./data', train=is_train, download=True, transform=transform)return DataLoader(dataset, batch_size=batch_size, shuffle=is_train, pin_memory=True)
http://www.dtcms.com/a/269841.html

相关文章:

  • Java 实现 Excel 文件对比与数据填充
  • 多线程(1)
  • Minmax 算法与 Alpha-Beta 剪枝小教学
  • (普及−)B3629 吃冰棍——二分/模拟
  • 【Spring WebSocket详解】Spring WebSocket从入门到实战
  • Spring Boot 事务失效问题:同一个 Service 类中方法调用导致事务失效的原因及解决方案
  • MATLAB/Simulink电机控制仿真代做 同步异步永磁直驱磁阻双馈无刷
  • CD46.【C++ Dev】list的模拟实现(1)
  • 一天一道Sql题(day02)
  • SSH密钥 与 Ed25519密钥 是什么关系
  • 服务器的RAID存储方案如何选择最合适?
  • 20250708-2-Kubernetes 集群部署、配置和验证-使用kubeadm快速部署一个K8s集群_笔记
  • 兰顿蚂蚁路径lua测试
  • 无缝高清矩阵与画面分割器的区别
  • OpenWebUI(5)源码学习-后端socket通信模块
  • Apache DolphinScheduler保姆级实操指南:云原生任务调度实战
  • iOS打包流程
  • navicat导出数据库的表结构
  • 鸿蒙分布式开发实战指南:让设备协同像操作本地一样简单
  • 深度 |以数字技术赋能服务消费场景创新
  • kafka如何让消息均匀的写入到每个partition
  • Spring Boot 多数据源切换:AbstractRoutingDataSource
  • Elasticsearch Kibana 使用 原理
  • 用基础模型构建应用(第七章)AI Engineering: Building Applications with Foundation Models学习笔记
  • Linux基础篇、第五章_01利用 Cobbler 实现 CentOS 7 与 Rocky 9.5 自动化安装全攻略
  • 记录一次在 centos 虚拟机 中 安装 Java环境
  • windows内核研究(系统调用 1)
  • 从传统项目管理到敏捷DevOps:如何转向使用DevOps看板工具进行工作流管理
  • 谁主沉浮:人工智能对未来信息技术发展路径的影响研究
  • 优化提示词提升VLLM准确率