不平衡数据研究:分配权重 合并2个loader

 分配权重(基于实例分配,基于类分配)

import numpy as np
import torch
from torch.utils.data import DataLoader, WeightedRandomSampler, Dataset

# Mock dataset class
class MockDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets
        self.dr = targets  # mimicking the 'dr' attribute in the original dataset

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]

# Mock get_sampling_probabilities function
def get_sampling_probabilities(class_count, mode='instance', ep=None, n_eps=None):
    if mode == 'instance':
        q = 0
    elif mode == 'class':
        q = 1
    elif mode == 'sqrt':
        q = 0.5
    elif mode == 'cbrt':
        q = 0.125
    elif mode == 'prog':
        assert ep is not None and n_eps is not None, 'progressive sampling requires to pass values for ep and n_eps'
        relative_freq_imbal = class_count ** 0 / (class_count ** 0).sum()
        relative_freq_bal = class_count ** 1 / (class_count ** 1).sum()
        sampling_probabilities_imbal = relative_freq_imbal ** (-1)
        sampling_probabilities_bal = relative_freq_bal ** (-1)
        return (1 - ep / (n_eps - 1)) * sampling_probabilities_imbal + (ep / (n_eps - 1)) * sampling_probabilities_bal
    else:
        sys.exit('not a valid mode')

    relative_freq = class_count ** q / (class_count ** q).sum()
    sampling_probabilities = relative_freq ** (-1)
    return sampling_probabilities

# Mock modify_loader function
def modify_loader(loader, mode, ep=None, n_eps=None):
    # 计算每个类别的样本数
    class_count = np.unique(loader.dataset.dr, return_counts=True)[1]
    print(f"class_count: {class_count}")

    # 获取每个类别的采样概率
    sampling_probs = get_sampling_probabilities(class_count, mode=mode, ep=ep, n_eps=n_eps)
    print(f"sampling_probs: {sampling_probs}")

    # 计算每个样本的权重
    sample_weights = sampling_probs[loader.dataset.dr]
    print(f"loader.dataset.dr:{loader.dataset.dr}")
    print(f"sample_weights: {sample_weights}")

    # 创建加权随机采样器
    mod_sampler = WeightedRandomSampler(weights=sample_weights, num_samples=len(sample_weights))
    # 创建新的数据加载器
    mod_loader = DataLoader(loader.dataset, batch_size=loader.batch_size, sampler=mod_sampler, num_workers=loader.num_workers)
    return mod_loader

# 模拟数据和标签
data = np.random.randn(100, 3, 32, 32)
targets = np.random.choice([0, 1, 2], size=100, p=[0.7, 0.2, 0.1])  # imbalanced classes

dataset = MockDataset(data, targets)
loader = DataLoader(dataset, batch_size=10, num_workers=1)

# 使用 'class' 模式进行均衡采样
modified_loader = modify_loader(loader, mode='class')

# 打印修改后的加载器中的一些样本
for i, (data, target) in enumerate(modified_loader):
    print(f"Batch {i}:")
    print(f"Data shape: {data.shape}, Targets: {target}")
    if i == 2:  # 仅打印前3个批次以简洁
        break

 合并2个loader

import numpy as np
import torch
from torch.utils.data import DataLoader, Dataset
import torch.nn.functional as F

# 定义一个简单的数据集类
class SimpleDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]

# 定义 ComboIter 类
class ComboIter(object):
    """An iterator."""
    def __init__(self, my_loader):
        self.my_loader = my_loader
        self.loader_iters = [iter(loader) for loader in self.my_loader.loaders]

    def __iter__(self):
        return self

    def __next__(self):
        # 获取每个 loader 的一个 batch
        batches = [loader_iter.__next__() for loader_iter in self.loader_iters]
        # 返回合并后的 batch
        return self.my_loader.combine_batch(batches)

    def __len__(self):
        return len(self.my_loader)

# 定义 ComboLoader 类
class ComboLoader(object):
    """This class wraps several pytorch DataLoader objects, allowing each time
    taking a batch from each of them and then combining these several batches
    into one. This class mimics the `for batch in loader:` interface of
    pytorch `DataLoader`.
    Args:
    loaders: a list or tuple of pytorch DataLoader objects
    """
    def __init__(self, loaders):
        self.loaders = loaders

    def __iter__(self):
        return ComboIter(self)

    def __len__(self):
        return min([len(loader) for loader in self.loaders])

    # 自定义合并批次的方法
    def combine_batch(self, batches):
        return batches

# 创建两个数据集和 DataLoader
data1 = torch.randn(100, 3, 32, 32)
targets1 = torch.randint(0, 2, (100,))
dataset1 = SimpleDataset(data1, targets1)
loader1 = DataLoader(dataset1, batch_size=10)

data2 = torch.randn(100, 3, 32, 32)
targets2 = torch.randint(0, 2, (100,))
dataset2 = SimpleDataset(data2, targets2)
loader2 = DataLoader(dataset2, batch_size=10)

# 使用 ComboLoader 合并两个 DataLoader
combo_loader = ComboLoader([loader1, loader2])

# 打印合并后的批次数据格式
print("\nCombined Loader batches:")
for i, batches in enumerate(combo_loader):
    print(f"Batch {i}:")
    for j, batch in enumerate(batches):
        print(f" Sub-Batch {j}: Data shape: {batch[0].shape}, Targets: {batch[1]}")
    if i == 2:  # 仅打印前3个批次以简洁
        break

 

import numpy as np
import torch
from torch.utils.data import DataLoader, Dataset

# 定义一个简单的数据集类
class SimpleDataset(Dataset):
    def __init__(self, data, targets):
        self.data = data
        self.targets = targets

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        return self.data[idx], self.targets[idx]

# 定义 ComboIter 类
class ComboIter(object):
    """An iterator."""
    def __init__(self, my_loader):
        self.my_loader = my_loader
        self.loader_iters = [iter(loader) for loader in self.my_loader.loaders]

    def __iter__(self):
        return self

    def __next__(self):
        # 获取每个 loader 的一个 batch
        batches = [loader_iter.__next__() for loader_iter in self.loader_iters]
        # 返回合并后的 batch
        return self.my_loader.combine_batch(batches)

    def __len__(self):
        return len(self.my_loader)

# 定义 ComboLoader 类
class ComboLoader(object):
    """This class wraps several pytorch DataLoader objects, allowing each time
    taking a batch from each of them and then combining these several batches
    into one. This class mimics the `for batch in loader:` interface of
    pytorch `DataLoader`.
    Args:
    loaders: a list or tuple of pytorch DataLoader objects
    """
    def __init__(self, loaders):
        self.loaders = loaders

    def __iter__(self):
        return ComboIter(self)

    def __len__(self):
        return min([len(loader) for loader in self.loaders])

    # 自定义合并批次的方法
    def combine_batch(self, batches):
        combined_data = torch.cat([batch[0] for batch in batches], dim=0)
        combined_targets = torch.cat([batch[1] for batch in batches], dim=0)
        return combined_data, combined_targets

# 创建两个数据集和 DataLoader
data1 = torch.randn(100, 3, 32, 32)
targets1 = torch.randint(0, 2, (100,))
dataset1 = SimpleDataset(data1, targets1)
loader1 = DataLoader(dataset1, batch_size=10)

data2 = torch.randn(100, 3, 32, 32)
targets2 = torch.randint(0, 2, (100,))
dataset2 = SimpleDataset(data2, targets2)
loader2 = DataLoader(dataset2, batch_size=10)

# 打印每个加载器中的一些批次数据
print("Loader 1 batches:")
for i, (data, targets) in enumerate(loader1):
    print(f"Batch {i}:")
    print(f"Data shape: {data.shape}, Targets: {targets}")
    if i == 2:  # 仅打印前3个批次以简洁
        break

print("\nLoader 2 batches:")
for i, (data, targets) in enumerate(loader2):
    print(f"Batch {i}:")
    print(f"Data shape: {data.shape}, Targets: {targets}")
    if i == 2:  # 仅打印前3个批次以简洁
        break

# 使用 ComboLoader 合并两个 DataLoader
combo_loader = ComboLoader([loader1, loader2])

# 打印合并后的批次数据
print("\nCombined Loader batches:")
for i, (data, targets) in enumerate(combo_loader):
    print(f"Batch {i}:")
    print(f"Data shape: {data.shape}, Targets: {targets}")
    if i == 2:  # 仅打印前3个批次以简洁
        break

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“AIGC行业投资时机分析:评估当前市场发展阶段与未来需求趋势“

文章目录 每日一句正能量前言行业前景当前发展前景相关领域的发展趋势行业潜力竞争情况结论 市场需求人才需求情况机会挑战结论 选择与规划自我评估行业调研职业规划风险管理个人陈述示例 后记 每日一句正能量 胖了就减,没钱就赚,不会就学,不…

上位机图像处理和嵌入式模块部署(mcu中的串口接口)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在mcu开发中,mcu扮演着非常重要的角色。一方面,串口可以帮助我们对固件功能进行调试,另外一方面,串…

申请表填写错误?河南道路与桥梁乙级资质申请表填写技巧

在填写河南道路与桥梁乙级资质申请表时,为了避免错误并确保申请顺利进行,以下是一些填写技巧: 仔细阅读申请指南: 在填写申请表之前,务必仔细阅读相关的申请指南或说明文件。这些文件会详细解释每个填写项的要求和目的…

【Linux系列】软链接使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【耕地保卫战:揭秘“占补平衡”】守护粮仓的智慧策略

嗨,各位小伙伴们,今天咱们来聊聊一个与我们每日餐桌紧密相关的主题——耕地占补平衡。在现代化的车轮滚滚向前时,如何在发展与保护之间找到那个微妙的平衡点,确保我们的“米袋子”满满当当呢?这就不得不提到耕地占补平…

PY32F系列32位单片机 特殊引脚复用说明

一 、 PY32F030 系 列 , 包 括 PY32F030 、PY32F003、 PY32F002A、 XL32F003 的特殊引脚使用说明。 1、晶振引脚的复用,使用 HSE/LSE 引脚作为 GPIO 功能引脚时,只要没有配置相关功能的情况下,正常配置 GPIO 功能即可。 其中&am…

法那科机器人M-900iA维修主要思路

发那科工业机器人是当今制造业中常用的自动化设备之一,而示教器是发那科机器人操作和维护的重要组成部分。 一、FANUC机械手示教器故障分类 1. 硬件故障 硬件故障通常是指发那科机器人M-900iA示教器本身的硬件问题,如屏幕损坏、按键失灵、电源故障等。 2…

纹理映射技术在AI去衣中的艺术与科技融合

引言: 在数字图像处理的世界里,AI去衣技术正逐步揭开其神秘的面纱。这门技术结合了深度学习的智能算法与图形学的先进手段,以实现对图像中衣物的智能识别与处理。在这一过程中,纹理映射技术发挥着至关重要的作用。本篇博客将深入探…

OpenHarmony实战开发——网络组件axios可以在OpenHarmony上使用了

什么是axios 上古浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十分…

Vision Mamba代码笔记

1 论文回顾 基本思路 论文解读见: 《VideoMamba》论文笔记_video mamba-CSDN博客 注意 Vision Mamba和VIT的输入和输出的shape的形状是相同的(VIT基于Transformer的Encoder设计,输入经过多层MHA和MLP计算,输入和输出的形状相同…

构建传统企业信息化数字化智能化技术架构:挑战与机遇

随着数字化和智能化技术的快速发展,传统企业在信息化转型过程中面临着前所未有的机遇和挑战。如何构建适应企业需求的信息化数字化智能化技术架构,成为企业发展的关键之一。本文将探讨传统企业信息化数字化智能化技术架构的设计与实践。 一、数字化转型的…

阿里云Linux 3.2104 LTS 64位安装SVN服务器

直接按步骤 yum install subversion 写y就行 主要是看看安装了那些文件 rpm -ql subversion 主要是为了创建版本库而准备,这个能一遍创建就一遍创建,不行就逐个创建。能创就忽略下面两个mkdir步骤。 mkdir /home/svn/groupRepos 根据新建目录作为版本…

Windows 10x64 IoT Enterprise LTSC 2021

打KB5036892补丁,升级版本19044.4291,打简体中文补丁包,系统后续升级需要升级英文补丁,需要重新打中文补丁包,系统禁用升级。禁用打印机服务,需要安装打印机的自行打开服务Print Spooler。 链接&#xff1a…

Docker-制作镜像的两种方式=》基于容器制作基于Dockerfile制作

本文主要是基于Docker如何制作一个Java镜像,而一个Java镜像想要运行需要系统环境,JDK。所以我们要先有一个系统环境,本文使用的是centos7,JDK选择版本是8,而我使用的Java程序是一个简易的springBoot项目,你…

时空扭曲:重温相对论的终极挑战,探寻真理的脚步

大家都知道,相对论是爱因斯坦提出的划时代理论,为人类认知时空和引力做出了革命性贡献。但这个理论真的万无一失吗?近日,一项新研究提出了测试时间扭曲的新方法,或许能让我们重新审视相对论在宇宙大尺度上的适用性。 时…

【数据结构】快速排序(详解)

目录 快速排序 历史: 基本思想: 主框架: 下面解释实现单次排序的几种版本: 1.Hoare版本 2. 挖坑法 3. 前后指针法 快速排序的实现包括递归与非递归: 1. 递归实现:(即开头的基本框架&am…

正在直播:Microsoft Copilot Studio 新增支持Copilot代理、Copilot扩展等多项功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

现代C++ 如何使用 Lambda 使代码更具表现力、更容易理解?

使用 Lambda 使代码更具表现力 一、Lambda VS. 仿函数二、总结 一、Lambda VS. 仿函数 Lambda 是 C11 中最引人注目的语言特性之一。它是一个强大的工具,但必须正确使用才能使代码更具表现力,而不是更难理解。 首先,要明确的是,…

上位机图像处理和嵌入式模块部署(mcu之串口控制gpio)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们陆续学习了gpio输入、输出,串口输入、输出。其实有了这两个接口,就可以做产品了。因为我们可以通过发送串口命令&a…

【智能算法应用】北方苍鹰算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】北方苍鹰优化算法(NGO)原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出,障碍物的栅格用黑色表示,可通过的…