前言

噪声标签学习下的一个任务是:训练集上存在开集噪声和闭集噪声;然后在测试集上对闭集样本进行分类。

训练集中被加入的开集样本,会被均匀得打上闭集样本的标签充当开集噪声;而闭集噪声的设置与一般的噪声标签学习一致,分为对称噪声:随机将闭集样本的标签替换为其他类别;和非对称噪声:将闭集样本的标签替换为特定的类别。

论文实验中,常用cifar数据集模拟这类任务。目前已知有两类方法:

  • 第一类基于cifar100,将100个类的一部分,通常是20个类作为开集样本,将它们标签替换了前80个类作为开集噪声;然后对于后续80个类,选择部分样本设置为对称/非对称闭集噪声。CVPR2022的PNP: Robust Learning From Noisy Labels by Probabilistic Noise Prediction提供的代码中,使用了这种方法。但是,如果要考虑非对称噪声,在cifar10上就很难实现,cifar10的类的顺序不像cifar100那样有规律,不好设置闭集噪声。

  • 第二类方法适用cifar10和cifar100,保持原始数据集的样本数不变,使用额外的数据集(通常是imagenet32、places365)代替部分样本作为开集噪声,对于剩下的非开集噪声样本再设置闭集噪声。ECCV2022的Embedding contrastive unsupervised features to cluster in-and out-of-distribution noise in corrupted image datasets提供的代码使用了这种方式。

places365可以使用torchvision.datasets.Places365下载,由于训练集较大,通常是用它的验证集作为辅助数据集。

imagenet32是imagnet的32x32版本,同样是1k类,但是类的具体含义的顺序与imagenet不同,imagenet32类的具体含义可见这里。image32下载地址在对应论文A downsampled variant of imagenet as an alternative to the cifar datasets提供的链接

接下来是用第二种方法,辅助数据集使用imagenet32,基于cifar构造含开集闭集噪声的训练集。

实验

设计imagenet32数据集

import os
import pickle
import numpy as np
from PIL import Image
from torch.utils.data import Dataset _train_list = ['train_data_batch_1',
'train_data_batch_2',
'train_data_batch_3',
'train_data_batch_4',
'train_data_batch_5',
'train_data_batch_6',
'train_data_batch_7',
'train_data_batch_8',
'train_data_batch_9',
'train_data_batch_10']
_val_list = ['val_data'] def get_dataset(transform_train, transform_test):
# prepare datasets # Train set
train = Imagenet32(train=True, transform=transform_train) # Load all 1000 classes in memory # Test set
test = Imagenet32(train=False, transform=transform_test) # Load all 1000 test classes in memory return train, test class Imagenet32(Dataset):
def __init__(self, root='~/data/imagenet32', train=True, transform=None):
if root[0] == '~':
root = os.path.expanduser(root)
self.transform = transform
size = 32
# Now load the picked numpy arrays if train:
data, labels = [], [] for f in _train_list:
file = os.path.join(root, f) with open(file, 'rb') as fo:
entry = pickle.load(fo, encoding='latin1')
data.append(entry['data'])
labels += entry['labels']
data = np.concatenate(data) else:
f = _val_list[0]
file = os.path.join(root, f)
with open(file, 'rb') as fo:
entry = pickle.load(fo, encoding='latin1')
data = entry['data']
labels = entry['labels'] data = data.reshape((-1, 3, size, size))
self.data = data.transpose((0, 2, 3, 1)) # Convert to HWC
labels = np.array(labels) - 1
self.labels = labels.tolist() def __getitem__(self, index): img, target = self.data[index], self.labels[index]
img = Image.fromarray(img) if self.transform is not None:
img = self.transform(img) return img, target, index def __len__(self):
return len(self.data)

目录结构:

imagenet32
├─ train_data_batch_1
├─ train_data_batch_10
├─ train_data_batch_2
├─ train_data_batch_3
├─ train_data_batch_4
├─ train_data_batch_5
├─ train_data_batch_6
├─ train_data_batch_7
├─ train_data_batch_8
├─ train_data_batch_9
└─ val_data

设计cifar数据集

import torchvision
import numpy as np
from dataset.imagenet32 import Imagenet32 class CIFAR10(torchvision.datasets.CIFAR10): def __init__(self, root='~/data', train=True, transform=None,
r_ood=0.2, r_id=0.2, seed=0, corruption='imagenet', ):
nb_classes = 10
self.nb_classes = nb_classes
super().__init__(root, train=train, transform=transform)
if train is False:
return
np.random.seed(seed)
if r_ood > 0.:
ids_ood = [i for i in range(len(self.targets)) if np.random.random() < r_ood]
if corruption == 'imagenet':
imagenet32 = Imagenet32(root='~/data/imagenet32', train=True)
img_ood = imagenet32.data[np.random.permutation(range(len(imagenet32)))[:len(ids_ood)]]
else:
raise ValueError(f'Unknown corruption: {corruption}')
self.ids_ood = ids_ood
self.data[ids_ood] = img_ood if r_id > 0.:
ids_not_ood = [i for i in range(len(self.targets)) if i not in ids_ood]
ids_id = [i for i in ids_not_ood if np.random.random() < (r_id / (1 - r_ood))]
for i, t in enumerate(self.targets):
if i in ids_id:
self.targets[i] = int(np.random.random() * nb_classes)
self.ids_id = ids_id class CIFAR100(torchvision.datasets.CIFAR100): def __init__(self, root='~/data', train=True, transform=None,
r_ood=0.2, r_id=0.2, seed=0, corruption='imagenet', ):
nb_classes = 100
self.nb_classes = nb_classes
super().__init__(root, train=train, transform=transform)
if train is False:
return
np.random.seed(seed)
if r_ood > 0.:
ids_ood = [i for i in range(len(self.targets)) if np.random.random() < r_ood]
if corruption == 'imagenet':
imagenet32 = Imagenet32(root='~/data/imagenet32', train=True)
img_ood = imagenet32.data[np.random.permutation(range(len(imagenet32)))[:len(ids_ood)]]
else:
raise ValueError(f'Unknown corruption: {corruption}')
self.ids_ood = ids_ood
self.data[ids_ood] = img_ood if r_id > 0.:
ids_not_ood = [i for i in range(len(self.targets)) if i not in ids_ood]
ids_id = [i for i in ids_not_ood if np.random.random() < (r_id / (1 - r_ood))]
for i, t in enumerate(self.targets):
if i in ids_id:
self.targets[i] = int(np.random.random() * nb_classes)
self.ids_id = ids_id

查看统计结果

import pandas as pd
import altair as alt
from dataset.cifar import CIFAR10, CIFAR100 # Initialize CIFAR10 dataset
cifar10 = CIFAR10(r_imb=0.)
cifar100 = CIFAR100(r_imb=0.) def statistics_samples(dataset):
ids_ood = dataset.ids_ood
ids_id = dataset.ids_id # Collect statistics
statistics = []
for i in range(dataset.nb_classes):
statistics.append({
'class': i,
'id': 0,
'ood': 0,
'clear': 0
}) for i, t in enumerate(dataset.targets):
if i in ids_ood:
statistics[t]['ood'] += 1
elif i in ids_id:
statistics[t]['id'] += 1
else:
statistics[t]['clear'] += 1 df = pd.DataFrame(statistics) # Melt the DataFrame for Altair
df_melt = df.melt(id_vars='class', var_name='type', value_name='count') # Create the bar chart
chart = alt.Chart(df_melt).mark_bar().encode(
x=alt.X('class:O', title='Classes'),
y=alt.Y('count:Q', title='Sample Count'),
color='type:N'
)
return chart chart1 = statistics_samples(cifar10)
chart2 = statistics_samples(cifar100)
chart1 = chart1.properties(
title='cifar10',
width=100, # Adjust width to fit both charts side by side
height=400
)
chart2 = chart2.properties(
title='cifar100',
width=800,
height=400
)
combined_chart = alt.hconcat(chart1, chart2).configure_axis(
labelFontSize=12,
titleFontSize=14
).configure_legend(
titleFontSize=14,
labelFontSize=12
)
combined_chart

运行环境

# Name                    Version                   Build  Channel
altair 5.3.0 pypi_0 pypi
pytorch 2.3.1 py3.12_cuda12.1_cudnn8_0 pytorch
pandas 2.2.2 pypi_0 pypi

基于cifar数据集合成含开集、闭集噪声的数据集的更多相关文章

  1. 机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集

    机器学习数据集,主数据集不能通过,人脸数据集介绍,从r包中获取数据集,中国河流数据集   选自Microsoft www.tz365.Cn 作者:Lee Scott 机器之心编译 参与:李亚洲.吴攀. ...

  2. R_Studio(决策树算法)鸢尾花卉数据集Iris是一类多重变量分析的数据集【精】

    鸢尾花卉数据集Iris是一类多重变量分析的数据集 通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类 针对 ...

  3. 基于用户的最近邻协同过滤算法(MovieLens数据集)

      基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...

  4. java 实现基于opencv全景图合成

    因项目需要,自己做了demo,从中学习很多,所以分享出来,希望有这方面需求的少走一些弯路,opencv怎么安装网上教程多多,这里不加详细说明,我安装的opencv-3.3.0 如上图所示,找到相应的j ...

  5. Pytorch文本分类(imdb数据集),含DataLoader数据加载,最优模型保存

    用pytorch进行文本分类,数据集为keras内置的imdb影评数据(二分类),代码包含六个部分(详见代码) 使用环境: pytorch:1.1.0 cuda:10.0 gpu:RTX2070 (1 ...

  6. pyTorch 基于以resnet50为backbone的PSPNet 训练VOC2012数据集

    代码链接:https://github.com/ggyyzm/pytorch_segmentation 使用PSPNet作为主干分类网络 1.将VOC2012数据集下载并解压到data/VOCtrai ...

  7. MyBatis操作指南-搭建项目基础环境(基于Java API)含log4j2配置

  8. 基于tensorflow的bilstm_crf的命名实体识别(数据集是msra命名实体识别数据集)

    github地址:https://github.com/taishan1994/tensorflow-bilstm-crf 1.熟悉数据 msra数据集总共有三个文件: train.txt:部分数据 ...

  9. Windows10+YOLOv3实现检测自己的数据集(1)——制作自己的数据集

    本文将从以下三个方面介绍如何制作自己的数据集 数据标注 数据扩增 将数据转化为COCO的json格式 参考资料 一.数据标注 在深度学习的目标检测任务中,首先要使用训练集进行模型训练.训练的数据集好坏 ...

  10. cifar数据集介绍及到图像转换的实现

    CIFAR是一个用于普通物体识别的数据集.CIFAR数据集分为两种:CIFAR-10和CIFAR-100.The CIFAR-10 and CIFAR-100 are labeled subsets ...

随机推荐

  1. 一键自动化博客发布工具,chrome和firfox详细配置

    blog-auto-publishing-tools博客自动发布工具现在已经可以同时支持chrome和firefox了. 很多小伙伴可能对于如何进行配置和启动不是很了解,今天带给大家一个详细的保姆教程 ...

  2. 13、web 中间件加固-Nginx 加固

    1.隐藏版本信息 避免被针对版本直接使用漏洞 修改 nginx.conf 文件 在 http 模块中添加信息:server_tokens off; 2.限制目录权限 某些目录为运维页面,不要公开访问 ...

  3. SQL Server实战七:自定义数据类型、标量值、内嵌表值、多语句表值函数的操作

      本文介绍基于Microsoft SQL Server软件,实现数据库用户自定义数据类型的创建.使用与删除,以及标量值.内嵌表值.多语句表值函数等用户定义函数的创建.使用.删除方法. 目录 1 用S ...

  4. C语言:判断是否为素数,并且打印素数表

    /*     构造素数表, 只需要用数字除以已经判断出来的数是否能整除就行,     不需要除以这个数之前所有的数字,     前提是这个数除以的素数是要比他自己小的      */ 注意一点:int ...

  5. kubernetes 之Health Check 健康检查

    默认的健康检查 这里Pod的restartPolicy设置为OnFailure,默认为Always. [machangwei@mcwk8s-master ~]$ cat mcwHealthcheck. ...

  6. 彻底搞懂JavaScript原型和原型链

    基于原型编程 在面向对象的编程语言中,类和对象的关系是铸模和铸件的关系,对象总是从类创建而来,比如Java中,必须先创建类再基于类实例化对象. 而在基于原型编程的思想中,类并不是必须的,对象都是通过克 ...

  7. wpf 斗地主 单机版 没有机器人出牌算法

    斗地主的游戏流程实现了,剩余的音效和机器人的出牌算法,抓地主算法就用最简单的实现. 主要实现了各种牌组的组合,牌组的大小比较,总共有16种牌组 基础牌组 单张.炸弹.炸弹型飞机带对子.炸弹型飞机什么都 ...

  8. 一个简单demo展示接口请求超时处理

    package main import ( "context" "errors" "fmt" "time" ) type ...

  9. Prism IoC 依赖注入

    现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Pri ...

  10. .NET桌面程序混合开发之二:在原生WinFrom程序中使用WebView2

    本文将介绍如何在WinForms中嵌入WebView2,并讲到WebView2的主要特征.点击了解更多WebView2的API. 1. 准备 Visual Studio 2017 及以上版本 WebV ...