数据集读取与划分,ImageFolder(),自定义数据集,TensorDataset,StratifiedShuffleSplit

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

目录

导包

数据集

下载数据集

数据集特点分析

torchvision.datasets.ImageFolder()

数据集整理

思路

根据图片名读标签

建立标签子文件夹

数据集划分

调用数据集处理函数

读取数据集 

torchvision.datasets.ImageFolder()源码及解读

源码

解读

torchvision.datasets.ImageFolder()的特点

手写ImageFolder()

自定义数据集

数据集处理

将标签转换成为int类型

自定义数据集函数 

读取数据集 

数据集划分函数

train_test_split函数

用法

读取数据集

存在的问题

StratifiedShuffleSplit函数

用法

读取数据集

为什么要进行reset_index()操作

探析

random_split()

用法

划分

读取数据集

探析

其他dataset

TensorDataset

源码

 建立数据集

使用dataloader

一个问题:对单个tensor进行包装


导包

import torch
import torchvision
import torchvision.transforms as transforms
import torch.nn as nn
import pandas as pd
import os
import collections
import shutil
import math
from torch.utils.data import DataLoader, Dataset
from PIL import Image


data_dir = 'data\dog-breed-identification'  # 数据集所在文件夹
label_csv = 'labels.csv'  # 标签文件夹名

数据集

原教程网站:13.13. 实战 Kaggle 比赛:图像分类 (CIFAR-10) — 动手学深度学习 2.0.0-beta1 documentation13.14. 实战Kaggle比赛:狗的品种识别(ImageNet Dogs) — 动手学深度学习 2.0.0-beta1 documentation13.13. 实战 Kaggle 比赛:图像分类 (CIFAR-10) — 动手学深度学习 2.0.0-beta1 documentation

参考:动手学深度学习Kaggle:图像分类 (CIFAR-10和Dog Breed Identification)_iwill323的博客-CSDN博客

下载数据集

数据集网址是CIFAR-10 - Object Recognition in Images | KaggleDog Breed Identification | KaggleCIFAR-10 - Object Recognition in Images | Kaggle

下载数据集,在../data中解压下载的文件后,你将在以下路径中找到整个数据集:

  •     ../data/dog-breed-identification/labels.csv
  •     ../data/dog-breed-identification/sample_submission.csv
  •     ../data/dog-breed-identification/train
  •     ../data/dog-breed-identification/test

文件夹train/和test/分别包含训练和测试狗图像,labels.csv包含训练图像的标签,其中train文件夹含有样本图片的如下图,图像文件的名称是杂乱的

数据集特点分析

比赛数据集分为训练集和测试集,分别包含RGB(彩色)通道的10222张、10357张JPEG图像。 在训练数据集中,有120种犬类,如拉布拉多、贵宾、腊肠、萨摩耶、哈士奇、吉娃娃和约克夏等。​

  • 用pandas读取trainLabels.csv文件
df = pd.read_csv(os.path.join(data_dir, label_csv))
df.head()

  • 标签个数
breeds = df.breed.unique()
len(breeds)
120
  • 训练集中每个种类的样本有多少
count_train = collections.Counter(df['breed'])
count_train.most_common() 
[('scottish_deerhound', 126),
 ('maltese_dog', 117),
 ('afghan_hound', 116),
 ……
 ('komondor', 67),
 ('brabancon_griffon', 67),
 ('eskimo_dog', 66),
 ('briard', 66)]

torchvision.datasets.ImageFolder()

数据集整理

思路

torchvision.datasets.ImageFolder()要求根目录下建立分类标签子文件夹,每个子文件夹下归档对应标签的图片,因此需要给每个标签建立文件夹,并且遍历样本,将每个样本复制到对应的文件夹中。本例在归档图片的时候,顺便把数据集划分了

根据图片名读标签

为了在根目录下按类别建立子文件夹,需要在读取每个样本图片名的时候,获得对应的类别标签label。然而,pandas一般根据表的index或者行数来选择数据,我没找到根据某一列的值索引其他列的数据的方法。教程根据一列的数据索引另一列的数据,下面的read_csv_labels()函数起到这样的作用,read_csv_labels函数返回的是一个字典格式的变量,该变量根据name可以索引label。

def read_csv_labels(fname):
    """读取fname来给标签字典返回一个文件名"""
    with open(fname, 'r') as f:
        # 跳过文件头行(列名)
        lines = f.readlines()[1:]
    tokens = [l.rstrip().split(',') for l in lines]
    return dict(((name, label) for name, label in tokens))

建立标签子文件夹

copyfile函数将图片从原位置filename复制到对应文件夹之下,只需要将target_dir指定为标签文件夹名字就行。

def copyfile(filename, target_dir):
    """将文件复制到目标目录"""
    os.makedirs(target_dir, exist_ok=True)  # 文件夹不存在则创建
    shutil.copy(filename, target_dir)

数据集划分

数据集只含有train和test数据集,而我们在训练的时候,一般还包含验证集,所以要划分出验证集处理。使用Google Colab这样的平台时,我们经常会将训练集、测试集、验证集压缩并上传,所以有时候要将它们划分、保存在不同的文件夹。

  • 定义reorg_train_valid函数来将验证集从原始的训练集中拆分出来。 此函数中的参数valid_ratio是验证集中的样本数与原始训练集中的样本数之比。 更具体地说,令n等于样本最少的类别中的图像数量,而r是比率。 验证集将为每个类别拆分出max(⌊nr⌋,1)张图像。以valid_ratio=0.1为例,由于原始的训练集有50000张图像,因此train_valid_test/train路径中将有45000张图像用于训练,而剩下5000张图像将作为路径train_valid_test/valid中的验证集。
  • 定义reorg_test函数将测试集数据复制到新文件夹,注意test文件夹下面也要有一个子文件夹(unknown)作为分类文件夹,否则torchvision.datasets.ImageFolder()会报错。因为ImageFolder()的find_classes()函数要从根文件夹下读取文件夹的名称,生成类别列表,没有这个列表就会导致错误
def reorg_train_valid(data_dir, labels, valid_ratio):
    """将验证集从原始的训练集中拆分出来"""
    # 训练数据集中样本最少的类别中的样本数
    n = collections.Counter(labels.values()).most_common()[-1][1]
    # 验证集中每个类别的样本数
    n_valid_per_label = max(1, math.floor(n * valid_ratio))
    label_count = {}
    for train_file in os.listdir(os.path.join(data_dir, 'train')):
        label = labels[train_file.split('.')[0]] # 根据文件名索引label
        fname = os.path.join(data_dir, 'train', train_file)
        copyfile(fname, os.path.join(data_dir, 'train_valid_test',
                                     'train_valid', label))
        if label not in label_count or label_count[label] < n_valid_per_label:
            copyfile(fname, os.path.join(data_dir, 'train_valid_test',
                                         'valid', label))
            label_count[label] = label_count.get(label, 0) + 1
        else:
            copyfile(fname, os.path.join(data_dir, 'train_valid_test',
                                         'train', label))
    return n_valid_per_label


def reorg_test(data_dir):
    """在预测期间整理测试集,以方便读取"""
    for test_file in os.listdir(os.path.join(data_dir, 'test')):
        copyfile(os.path.join(data_dir, 'test', test_file),
                 os.path.join(data_dir, 'train_valid_test', 'test',
                              'unknown'))

调用数据集处理函数

labels.values()的格式是<class 'builtin_function_or_method'>,可以用于collections.Counter()方法 

def reorg_cifar10_data(data_dir, label_csv, valid_ratio):
    labels = read_csv_labels(os.path.join(data_dir, label_csv))
    reorg_train_valid(data_dir, labels, valid_ratio)
    reorg_test(data_dir)


batch_size = 128
valid_ratio = 0.1
reorg_cifar10_data(data_dir, label_csv, valid_ratio)

代码执行的效果是,创建了四个文件夹,分别是test,train(9502个样本),valid(720个样本)和train_valid,其中train_valid是train和valid的合集。建立train_valid文件夹是因为,使用验证集筛选出最佳超参数之后,再使用train_valid训练一遍,得到最终模型

每一个文件夹下按照类别创建了120个分类文件夹,这是torchvision.datasets.ImageFolder()函数的要求。

读取数据集 

读取由原始图像组成的数据集,每个样本都包括一张图片和一个标签。注意,当验证集在超参数调整过程中用于模型评估时,不应引入图像增广的随机性,所以valid数据集使用的transform是transform_test

train_ds, train_valid_ds = [torchvision.datasets.ImageFolder(
    os.path.join(data_dir, 'train_valid_test', folder),
    transform=train_transform) for folder in ['train', 'train_valid']]

valid_ds, test_ds = [torchvision.datasets.ImageFolder(
    os.path.join(data_dir, 'train_valid_test', folder),
    transform=test_transform) for folder in ['valid', 'test']]

train_iter, train_valid_iter = [torch.utils.data.DataLoader(
    dataset, batch_size, shuffle=True, drop_last=True)
    for dataset in (train_ds, train_valid_ds)]

valid_iter = torch.utils.data.DataLoader(valid_ds, batch_size, shuffle=False,
                                         drop_last=True)

test_iter = torch.utils.data.DataLoader(test_ds, batch_size, shuffle=False,
                                        drop_last=False)

其中用到的图像增广:

img_size = 224  # 也可以是其他值
train_transform = transforms.Compose([    
    transforms.RandomResizedCrop(img_size, ratio=(3.0/4.0, 4.0/3.0)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(30),
    transforms.ColorJitter(brightness=0.4, contrast=0.4, saturation=0.4),
    transforms.ToTensor(),
    transforms.Nor
从pytorch的transfer learning tutorial讲分类任务的数据读取(深入分析torchvision.datasets.ImageFolder源码 看了pytorch官方提供的tutorial中transfer learning这个例子,对其中的数据读取部分很是模糊,于是仔细分析了一番,今天写一篇博客记录一下自己所看所得。 dataloader 下面这段代码最终得到了dataloader,dataloader是python中的可迭代对象,我们可以通过for循环讲数据一一取出。 data_transforms = { ... 阅读详情

相关推荐

torchvision.datasets.ImageFolder使用详解

是一个通用的数据加载器,它要求我们以下面这种格式来组织数据集的训练、验证或者测试图片。对于上面的root,假设data文件夹在.py文件的同级目录中,那么root一般都是如下这种形式./data/train和./data/valid。...

源仔 6877

torchvision.datasets.ImageFolder()使用详解

一、数据集组织方式 ImageFolder是一个通用的数据加载器,它要求我们以下面这种格式来组织数据集的训练、验证或者测试图片。 root/dog/xxx.png root/dog/xxy.png root/dog/xxz.png root/cat/123.png root/cat/nsdf3.png root/cat/asd932_.png 对于上面的root,假设data文件夹在.py文件的同级目录中,那么root一般都是如下这种形式:./data/train 和 ./data/valid

Drug discovery 5万+

tf2.0如何读取数据集图片jpg格式的标签文件夹

@tf2.0如何读取数据集jpg格式的标签文件夹,即y_test 我们的数据集是如下形式,内部都是jpg格式: 一 tensorflow2.0-从文件夹中读取图片数据 导入包: from tensorflow.keras.preprocessing.image import ImageDataGenerator ImageDataGenerator-图片生成器,使用它在batch中对数据进行增强,扩充数据集大小,从而增强模型的泛化能力。 keras.preprocessing.image.ImageD

weixin_44152421的博客 927

Torchvision.datasets中的ImageFolder函数详解

前几天在看代码时遇到制作数据集的一条代码: train_datasets = datasets.ImageFolder(train_dir, transform = train_transforms) train_dataloader = torch.utils.data.DataLoader(train_datasets, batch_size = batch_size, shuffle = True) 主要是对Torchvision.datasets中的ImageFolder函数的不理解通过查该函数的源

mingxinchang的博客 8264

ImageFolder类上添加划分数据集和打乱数据的功能

问题描述 ImageFolder是一个非常有用的类,只要数据集按照要求规范文件,就可以很轻松的,得到 文件路径和类型 的元祖。同时加载DataLoader 也非常方便,但是在实际用的时候发现缺少了划分数据集的功能,并且是按照数据也是按照文件夹依次得到的,这对划分数据集上非常不利的。 解决 通过阅读ImageFolder源码并在其基础上继承并添加自己的功能。 import time import torch import visdom import torchvision from torchvision

Alex抱着爆米花的博客 2926

【树叶分类】kaggle竞赛

Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行。sampler:自定义的采样器(shuffle=True时会构建默认的采样器,如果想使用自定义的方法需要构造一个torch.utils.data.Sampler的实例来进行采样,并设置shuffle=False,将实例作为参数传入),返回一个数据数据的下标索引。因为使用了使用ImageNet的均值和标准差。

SJZSZYH的博客 854

计算机视觉技巧合集(一)如何读取数据集

在计算机视觉领域,数据的重要性不可忽视。数据是训练和提升视觉算法的关键基石,它们为计算机系统提供了对世界的认知能力。丰富、多样的数据集可以帮助计算机视觉模型学习视觉特征、识别对象和场景,并进行准确的预测。数据的质量和多样性直接影响了模型的性能和鲁棒性。因此,有效地获取、整理和利用数据是实现出色计算机视觉应用的关键要素。计算机视觉主要分为图像分类、目标检测和图像分割这3大类任务,任务不同,所使用的数据也不同,其读取方式也是不一样的。因此,本文将具体说明如何读取图像分类和目标检测任务的数据。

qq_40691600的博客 1229

深度学习制作自己的数据集—为数据集打上标签保存为txt文件,并进行划分和加载数据集

1 为图片数据集打上标签并保存为txt文件 2 将txt文件中的图片标签数据集随机划分为训练集和测试集 3 加载txt文件中的图片标签数据集

weixin_42795788的博客 1万+

Pytorch模型训练-----------数据集加载之ImageFolder之全过程

数据集加载之ImageFolder ImageFolder一个通用的数据加载器,数据集中的数据以以下方式组织 函数如下 ImageFolder(root, transform``=``None``, target_transform``=``None``, loader``=``default_loader) 参数解释 root 指定路径加载图片 transform:对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象 target_tran

ahelloyou的博客 7045

【单点知识】基于实例讲解PyTorch中的ImageFolder

ImageFolder专题讲解

使者大牙ℂypher的博客 3326

从VOC数据集中提取部分图片对应的标签文件

本人从VOC数据集中提取单一类别的目标图片,然后获取单一目标图片对应的标签文件

weixin_48192326的博客 594

利用Cifar10 数据集跑resnet网络

数据集采用的是kaagle⽐赛中的Cifar10,⽹址是比赛数据集分为训练集和测试集,其中训练集包含50000张、测试集包含300000张图像。两个数据集中的图像都是png格式,⾼度和宽度均为32像素并有三个颜⾊通道(RGB这些图⽚共涵盖10个类别:⻜机、汽⻋、⻦类、猫、⿅、狗、⻘蛙、⻢、船和卡⻋。

m0_57122465的博客 1644

利用Pytorch搭建简单的图像分类模型(之一)---读取数据

利用Pytorch搭建简单的图像分类模型(之一)---读取数据

Hust_GreenHand的博客 2105

pytorch 实现自己的ImageFolder(可以在分类任务中加载图像对)

针对pytorch中torchvision.datasets.ImageFolder函数只能加载单一图像而无法同时加载图像和mask的问题进行改进,以实现该功能。

lyt252012778的博客 636

pytorch 源码片段:torchvision.datasets.ImageFolder

Source code for torchvision.datasets.folder def find_classes(dir): classes = [d for d in os.listdir(dir) if os.path.isdir(os.path.join(dir, d))] classes.sort() class_to_idx = {classes[i]:...

kaixinjiuxing666的博客 2938

Pytorch torchvision.datasets.DatasetFolder.find_classes()

Python torchvision.datasets.DatasetFolder.find_classes()

Z2572862506的博客 652

torchvision.datasets.ImageFolder

这篇博客讲解了如何自定义一个 Dataset类 返回训练数据标签,但是对于简单的图像分类任务,并不需要自己定义一个 Dataset类,可以直接调用 torchvision.datasets.ImageFolder 返回训练数据标签。 1. 数据集组织方式 既然是调用API,那么你的数据集必然得按照API的要求去组织, torchvision.datasets.ImageFolder 要求数据...

The Thinker 2万+

代码系列:pytorch——torchvision.datasets.ImageFolder

参考博客:https://blog.csdn.net/TH_NUM/article/details/80877435 用于从文件夹中读取数据,源码链接:https://github.com/pytorch/vision/blob/master/torchvision/datasets/folder.py ImageFolder是DatasetFolder的子类,有以下属性: Attribu...

lynlindasy的博客 1833
上一篇: 李宏毅机器学习笔记——Anomaly Detection(异常侦测),ROC AUC score
下一篇: 李宏毅机器学习作业1——预测COVID-19人数
iwill323
博客等级 码龄5年 96粉丝 73原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值