DRW的公式推导及代码解析

news2024/11/12 21:29:04

流程

分阶段指定β值

    # 根据当前epoch计算使用的beta值
    idx = epoch // 160  # 每160轮epoch切换一次加权系数
    betas = [0, 0.9999]  # 两个beta值
    beta = betas[idx]  # 根据idx选择beta值

计算有效样本的权重

对权重进行归一化

(每类权重值 / 权重总和)* 样本数量

    # 将权重进行归一化
    per_cls_weights = per_cls_weights / np.sum(per_cls_weights) * len(cls_num_list)
    print(f"Class weights after normalization: {per_cls_weights}")

代码

import numpy as np
import torch

def calculate_per_cls_weights(cls_num_list, epoch, device):
    # 训练采样器设为空
    train_sampler = None
    print(f"Train sampler: {train_sampler}")
    
    # 根据当前epoch计算使用的beta值
    idx = epoch // 160  # 每160轮epoch切换一次加权系数
    print(f"Epoch: {epoch}, Beta index (idx): {idx}")
    
    betas = [0, 0.9999]  # 两个beta值
    beta = betas[idx]  # 根据idx选择beta值
    print(f"Selected beta value: {beta}")
    
    # 计算每个类别的有效样本数 effective_num
    effective_num = 1.0 - np.power(beta, cls_num_list)
    print(f"Effective number (for each class): {effective_num}")
    
    # 计算每个类别的权重 per_cls_weights
    per_cls_weights = (1.0 - beta) / effective_num
    print(f"Class weights before normalization: {per_cls_weights}")
    
    # 将权重进行归一化
    per_cls_weights = per_cls_weights / np.sum(per_cls_weights) * len(cls_num_list)
    print(f"Class weights after normalization: {per_cls_weights}")
    
    # 将权重转为张量并移动到指定设备上
    per_cls_weights = torch.FloatTensor(per_cls_weights).to(device)
    print(f"Final weights as a tensor on device ({device}): {per_cls_weights}")
    
    return per_cls_weights

# 示例
cls_num_list = [100, 50, 10, 5]  # 假设数据集中有4个类别,样本数分别为100、50、10、5
epoch = 200  # 当前训练轮次
device = 'cuda' if torch.cuda.is_available() else 'cpu'  # 选择设备

# 计算类别权重
per_cls_weights = calculate_per_cls_weights(cls_num_list, epoch, device)
print("Per class weights:", per_cls_weights)

解析

前面部分所有类别权重相等。

在你的 Acne04 数据集上,BKD 在第 77 个 epoch 时测试集准确率达到最大值,并且此时并没有使用有效样本的计算,而是直接按照类平衡去计算就取得了最大的效果。出现这种现象的原因可能包括以下几点:

  1. 类平衡策略的优势:BKD 的类平衡蒸馏策略通过对尾部类别施加更高的权重来使得模型在尾部类别上获得更好的表现。即使没有用到有效样本的计算,类平衡蒸馏本身已经纠正了模型对频繁类别的偏向,从而大幅提升了尾部类别的表现。这种简单的类平衡策略可能已经足够有效,以至于能够在较早的 epoch 中达到最佳的分类效果。

  2. 数据集规模和分布的影响:Acne04 数据集的规模较小,类别不平衡的情况可能并没有特别严重,因此即使没有采用更复杂的有效样本计算,类平衡蒸馏就能够取得显著的性能提升。对于这种中等规模或类别分布不那么极端的数据集,较为简单的类平衡方法往往足够有效。

  3. 训练的早期收敛:在第 77 个 epoch 时,模型可能已经充分学习到了数据中的特征,尤其是在使用 BKD 的情况下,模型不仅能够学到头部类别的泛化特征,还能够有效提升尾部类别的表现。这表明 BKD 提供的类平衡机制已经足以解决该数据集上的类不平衡问题,而不需要依赖更复杂的有效样本策略。

  4. 蒸馏温度和超参数的影响:BKD 蒸馏过程中使用的温度参数 TTT 可能在此时已经使得教师模型的软标签足够平滑,进一步帮助学生模型更好地学习尾部类别的特征,而无需通过有效样本策略来调整每类的权重分布。

因此,在 Acne04 数据集上,BKD 的类平衡机制已经足够有效,使得模型在第 77 个 epoch 时就达到了测试集准确率的最大值,即使没有使用更加复杂的有效样本策略​(Balanced Knowledge Dist…)

程度没有那么严重的不平衡数据集,是不是就用类平衡策略就可以了,比其他的平衡策略更好使一点?

是的,对于不平衡程度没有那么严重的数据集,使用类平衡策略(如 BKD 中的类平衡蒸馏)通常已经足够有效,且可能比其他复杂的平衡策略表现得更好。原因如下:

  1. 简单有效:类平衡策略通过调整不同类别的权重,让模型在学习时关注那些少数类。这种方法的简单性意味着它能够快速适应不太严重的类不平衡数据集,而不需要像更复杂的重采样或有效样本计算那样复杂的机制。

  2. 避免过度调整:在不太严重的不平衡数据集中,过度使用复杂的平衡策略(如重采样或有效样本计算)可能会导致对尾部类别的过度关注,反而损害头部类别的表现。类平衡策略通过温和的权重调整,更好地维持了头部和尾部类别之间的平衡,不会过度影响整体模型的泛化能力。

  3. 计算效率:类平衡策略相对简单,计算开销较低,不需要频繁调整采样或计算每个类别的有效样本数,因此训练过程更加高效。对于不太严重的类不平衡问题,这种高效的解决方案通常已经足够有效。

  4. 蒸馏的优势:BKD 的类平衡蒸馏策略在学习时不仅关注少数类,还能通过蒸馏从教师模型中学习整体数据的分布。因此,它能够在提升尾部类别性能的同时保持对头部类别的良好表现,这对于不太严重的不平衡问题尤为重要。

因此,对于不平衡程度较低的数据集,类平衡策略通常能提供足够的性能提升,同时避免了更复杂策略可能带来的负面影响,如过度拟合少数类或损害模型的整体性能​(Balanced Knowledge Dist…)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第7篇:【系统分析师】计算机网络

考点汇总 考点详情 1网络模型和协议:OSI/RM七层模型,网络标准和协议,TCP/IP协议族,端口 七层:应用层,表示层,会话层,传输层,网络层,数据链路层,…

MBD_入门篇_23_SimulinkSinks

23.1 概述 Sink库里面是Simulink的显示或导出信号数据的模块,可以理解为信号的最后接收的模块,要么用于显示要么用于传递给更上层的系统要么终止。 Sink库里面的模块都只有输入,没有输出。 23.2 回顾常用模块 23.2.1 Display 用于实时仿真…

终端文件管理神器 !!!【送源码】

项目简介 nnn是一款专为命令行爱好者打造的高效终端文件管理器。它以其超小的体积、几乎零配置的要求以及卓越的速度表现而著称。nnn不仅适用于Linux、macOS、BSD等操作系统,还能够在诸如树莓派、Android上的Termux、WSL、Cygwin等多个平台运行。它遵循POSIX标准&am…

EPSG 标识符和Web墨卡托投影的关系

Web 墨卡托投影使用修改版的墨卡托投影,并已成为 Web 制图的默认地图投影。此投影的主要区别在于它在所有尺度上都使用球面公式。而墨卡托投影使用与赤道相切的垂直圆柱投影。以下是 Web 墨卡托投影成为 Web 和在线制图事实上的标准的一些原因。 哪些 Web 地图使用 Web Merca…

从 Data 到 Data + AI,必然之路还是盲目跟风?

从 Data 到 Data AI,必然之路还是盲目跟风? 前言从 Data 到 Data AI 前言 数据和人工智能的发展日新月异,深刻地改变着我们的生活和工作方式。数据平台作为数据处理和分析的核心基础设施,也在不断演进和发展。从数据库时代到大…

Linux系统使用Docker安装DockerUI并实现远程管理本地容器无需公网IP

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

如何用MATLAB搭建ResNet网络(复现论文)

文章目录 前言基础工具网络搭建ResNet网络代码完整代码总结参考文献 前言 之前暑假实习了3个月,后来又赶上开学一堆事,现在终于有时间记录一下学习经历。新的学期开始了,要继续努力。 因为最近要做一个无人机航迹分类的项目,所以…

一周完成计算机毕业设计论文:高效写作技巧与方法(纯干货/总结与提炼)

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Trie字符串统计(每周一类)

这节课我们学习Trie字符串。这个算法的主要应用就是字符串的快速存储和查找。我们通过下面这个题来讲 Tire字符串统计 ,另外说个题外话,本人是从ACwing里学习的算法知识,希望大家支持一下y总(ACwing大佬),如果觉得我这里的知识讲得…

Unity Apple Vision Pro 开发(十):通过图像识别锚定空间

XR 开发者社区链接: SpatialXR社区:完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程试看:https://www.bilibili.com/video/BV1mpH9eVErW 课程完整版,答疑仅社区成员可见,可以通过文章开头的链接加入…

另类动态规划

前言&#xff1a;一开始我根本想不到这个题目是一个动态规划的题目&#xff0c;而且我一开始的初始状态还写错了 我还忘记了写算法题的基本步骤&#xff0c;先看数据范围&#xff0c;再考虑能不能用动态规划写 题目地址 #include <bits/stdc.h> using namespace std; #de…

RTR_Chapter_4_上半部分

第四章 Transform 变换 变换&#xff08;transform&#xff09;是指以点、向量、颜色等实体作为输入&#xff0c;并以某种方式对其进行转换的一种操作。对于计算机图形学从业者而言&#xff0c;熟练掌握变换相关的知识是非常重要的。通过各种变换操作可以对物体、光源和相机进…

开源网安斩获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

数据库——MySQL概述

一、数据库 存储数据的仓库&#xff0c;数据是有组织的存储&#xff0c;简称database&#xff08;DB&#xff09; 二、数据库管理系统 操控和管理数据库的大型软件&#xff08;DBMS&#xff09; 三、SQL 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…

【2024】前端学习笔记1-HTML主体框架-文本标签

学习笔记 HTML主体框架标题标签:h段落标签:p加粗标签:strong、b斜体文本标签:em、i下划线标签:u上标、下标:sup、sub内联容器:span换行标签:brHTML主体框架 HTML主体框架 <!DOCTYPE html> <html lang="en"><head><meta charset="…

【Linux 19】线程概念

文章目录 &#x1f308; 一、线程的概念⭐ 1. 线程是什么⭐ 2. 线程的优点⭐ 3. 线程的缺点⭐ 4. 线程的异常⭐ 5. 线程的用途 &#x1f308; 二、进程和线程⭐ 1. 进程和线程的区别⭐ 2. 进程的多线程共享⭐ 3. 进程和线程的关系⭐ 4. 线程私有的资源 (重要&#xff1a;面试) …

Map--08--CurrentHashMap 与 Hashtable的异同?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Map方法computeIfAbsent1.computeIfAbsent 方法的简介2.案例computeIfAbsent() Map方法computeIfAbsent computeIfAbsent方法是Java 8中引入的一种简化操作Map的方…

探索 AI 代理驱动的汽车保险索赔 RAG 管道。

这篇文章中&#xff0c;我探讨了最近的一项实验&#xff0c;旨在创建一个针对保险行业量身定制的 RAG 管道&#xff0c;专门用于处理汽车保险索赔&#xff0c;目的是尽可能减少处理时间。 我还展示了 Autogen AI Agents 的实施&#xff0c;通过代理交互和对样本汽车保险索赔文件…

李宏毅结构化学习 01

文章目录 一、结构化学校介绍二、线性模型 一、结构化学校介绍 训练时&#xff0c;F(x,y)是评估X与Y有多匹配&#xff0c;越匹配&#xff0c;R的值就越大。 测试时&#xff0c;确定F(x,y)后&#xff0c;给定一个x后&#xff0c;穷举所有y&#xff0c;使得F最大的那个就是 y ~ \…

k8s的配置

k8s的配置 拉取镜像&#xff0c;创建pod&#xff1a;从阿里云拉取 [rootk8s-master ~]# kubectl run nginx --imagenginx:latest [rootk8s-master ~]# kubectl get po -Aowide|grep nginx default nginx 0/1 ImagePullBackO…