使用 **迭代器** 获取 Cifar 等常用数据集

简介: 一个很方便使用的数据库。

CifarMNIST 等常用数据集的坑:

  • 每次在一台新的机器上使用它们去训练模型都需要重新下载(国内网络往往都不给力,需要花费大量的时间,有时还下载不了);
  • 即使下载到本地,然而不同的模型对它们的处理方式各不相同,我们又需要花费一些时间去了解如何读取数据。

为了解决上述的坑,我在Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集中将一些常用的数据集封装为 HDF5 文件。

下面的 X.h5c 可以参考Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集自己制作,也可以直接下载使用(链接:https://pan.baidu.com/s/1hsbMhv3MDlOES3UDDmOQiw 密码:qlb7)。

使用方法很简单:

访问数据集

# 载入所需要的包
import tables as tb
import numpy as np
xpath = 'E:/xdata/X.h5'  # 文件所在路径
h5 = tb.open_file(xpath)

下面我们来看看此文件中有那些数据集:

h5.root
/ (RootGroup) "Xinet's dataset"
  children := ['cifar10' (Group), 'cifar100' (Group), 'fashion_mnist' (Group), 'mnist' (Group)]

下面我们以 Cifar 为例,来详细说明该文件的使用:

cifar = h5.root.cifar100   # 获取 cifar100

为了高效使用数据集,我们使用迭代器的方式来获取它:

class Loader:
    """
    方法
    ========
    L 为该类的实例
    len(L)::返回 batch 的批数
    iter(L)::即为数据迭代器

    Return
    ========
    可迭代对象(numpy 对象)
    """

    def __init__(self, X, Y, batch_size, shuffle):
        '''
        X, Y 均为类 numpy 
        '''
        self.X = X
        self.Y = Y
        self.batch_size = batch_size
        self.shuffle = shuffle

    def __iter__(self):
        n = len(self.X)
        idx = np.arange(n)

        if self.shuffle:
            np.random.shuffle(idx)

        for k in range(0, n, self.batch_size):
            K = idx[k:min(k + self.batch_size, n)].tolist()
            yield np.take(self.X, K, 0), np.take(self.Y, K, 0)

    def __len__(self):
        return round(len(self.X) / self.batch_size)

下面我们可以使用 Loader 来实例化我们的数据集:

batch_size = 512
train_cifar = Loader(cifar.trainX, cifar.train_fine_labels, batch_size, True)
test_cifar = Loader(cifar.testX, cifar.test_fine_labels, batch_size, False)

读取一个 Batch 的数据:

for imgs, labels in iter(train_cifar):
    break
names = np.asanyarray([cifar.fine_label_names[label] for label in labels], dtype='U')
names[:7]
array(['orchid', 'spider', 'rabbit', 'shark', 'shrew', 'clock', 'bed'],
      dtype='<U13')

可视化

需要注意,这里的 Cifarfirst channel 的,即:

imgs.shape
(512, 3, 32, 32)
names.shape
(512,)
from pylab import plt, mpl


mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号 '-' 显示为方块的问题


def show_imgs(imgs, labels):
    '''
    展示 多张图片
    '''
    imgs = np.transpose(imgs, (0, 2, 3, 1))
    n = imgs.shape[0]
    h, w = 5, int(n / 5)
    fig, ax = plt.subplots(h, w, figsize=(7, 7))
    K = np.arange(n).reshape((h, w))
    names = np.asanyarray([cifar.fine_label_names[label] for label in labels], dtype='U')
    names = names.reshape((h, w))
    for i in range(h):
        for j in range(w):
            img = imgs[K[i, j]]
            ax[i][j].imshow(img)
            ax[i][j].axes.get_yaxis().set_visible(False)
            ax[i][j].axes.set_xlabel(names[i][j])
            ax[i][j].set_xticks([])
    plt.show()
show_imgs(imgs[:25], labels[:25])

output_19_0.png-89.9kB

$2$ 个深度学习框架 & 数据集

因为,上面的数据集是 NumPyarray 形式,故而:

TensorFlow

import tensorflow as tf
for imgs, labels in iter(train_cifar):
    imgs = tf.constant(imgs)
    labels = tf.constant(labels)
    break
imgs
<tf.Tensor 'Const:0' shape=(512, 3, 32, 32) dtype=uint8>
labels
<tf.Tensor 'Const_1:0' shape=(512,) dtype=int32>

MXNet

from mxnet import nd, cpu, gpu
for imgs, labels in iter(train_cifar):
    imgs = nd.array(imgs, ctx = gpu(0))
    labels = nd.array(labels, ctx = cpu(0))
    break
imgs.context
gpu(0)
labels.context
cpu(0)

Matlab 读取 HDF

参考:h5read
捕获.PNG-65.5kB

目录
相关文章
|
2月前
|
人工智能 IDE 开发工具
【开发者必看】WindSurf官网下载安装:AI编程IDE让写代码更轻松
Windsurf 是 Codeium 推出的新一代 AI 原生 IDE,深度集成 Cascade 智能代理,支持实时代码库理解、多行智能补全、自然语言驱动的跨文件修改与错误诊断。区别于插件式方案,它从底层重构开发体验,免费版即享核心功能。(239字)
|
3月前
|
弹性计算 缓存 测试技术
7月:阿里云服务器配置价格表
阿里云服务器提供丰富的实例规格与灵活的计费方式,覆盖个人轻量应用、中小企业业务、企业级高并发场景等各类需求,不同配置与付费模式价格差异显著,可根据业务负载、使用时长与预算精准选择。
548 0
|
6月前
|
人工智能 文字识别 内存技术
阿里云Tokens如何收费?免费千万Tokens领取及亿万AI大模型扶持计划申请入口
阿里云Tokens按输入/输出分别计费,价格因模型而异(如Qwen-Turbo:0.0003/0.0006元/千Tokens)。新用户开通百炼平台可免费领7000万Tokens(各模型享100万额度),企业认证还可申领万亿Tokens扶持及2000元券,免费Tokens申请链接:https://t.aliyun.com/U/fPVHqY
743 6
|
8月前
|
人工智能 开发框架 Java
Java大模型开发实践:框架赋能与核心落地要点
JBoltAI是面向Java企业的轻量级大模型开发框架,基于SpringBoot构建,提供统一API、RAG知识库、资源池化管理及插件化扩展能力,支持多模型/向量库兼容与私有化部署,显著降低AI集成门槛,助力高效工程化落地。(239字)
298 1
|
9月前
|
运维 自然语言处理 供应链
企业前台机器人OEM厂家全景扫描:猎户星空等头部企业定制能力解析
在数字化转型浪潮下,企业前台机器人正从“科技展示”迈向“效率工具”。本文系统解析国内OEM市场三大梯队,聚焦技术实力、定制能力与服务保障,重点推荐具备全链路自研、大模型赋能和深度场景适配的猎户星空,助力企业高效选型,实现智能化升级。
|
10月前
|
JSON API 数据格式
1688 API接口的应用场景介绍
1688是阿里巴巴旗下B2B批发平台,其API支持商品、订单、库存、价格及物流数据的自动化获取与同步,助力企业实现系统集成与数据驱动运营。通过RESTful接口,结合OAuth认证,开发者可高效构建电商、ERP、BI等应用,提升供应链效率。
|
JSON API 数据格式
淘宝商品列表API接口攻略(附代码示例)
淘宝商品列表API接口用于获取淘宝商品信息,支持按关键词、类目、价格区间等条件查询,返回商品标题、价格、销量等数据。通过构造HTTP请求并解析JSON响应,可提取所需信息。示例代码展示了使用Python调用该API的流程,包括生成签名和请求参数配置,方便开发者快速上手。
692 12
|
机器学习/深度学习 人工智能 机器人
魔搭社区模型速递(5.11-5.17)
🙋魔搭ModelScope本期社区进展:📟1656个模型,151个数据集,645个创新应用,📄 9 篇内容
675 11
|
安全 搜索推荐
ChatGPT高效提问—prompt实践(健康助手)
ChatGPT高效提问—prompt实践(健康助手)
672 0