CIFAR数据读取

转自:https://blog.csdn.net/supercally/article/details/53456665

1. CIFAR简介

CIFAR是一个图像分类的数据集,包含60,000张32*32的图片,分十个类别(飞机、机动车、鸟类等等),每个类有1000张图片。整个数据集被分成50,000和10,000两部分,50,000是training set,用来做训练;10,000是test set,用来做验证

2. CIFAR结构介绍

官方数据源提供多种语言的数据集,如果你从官方数据源下载CIFAR的python版的数据集的话,数据集的结构是这样的:

  • batches.meta
  • data_batch_1
  • data_batch_2
  • data_batch_3
  • data_batch_4
  • data_batch_5
  • test_batch
  • readme.html

其中batches.meta保存的是元数据,是一个字典结构,包括 
- num_cases_per_batch: 每一个batch的数据的数据的多少,这里是10,000 
- label_names:标签的名称,在数据集中标签是按index分类,相应的index的名字就在这里 
- num_vis:数据的维度,这里是3072

3. 读取CIFAR中的Image和Label

3.0 CIFAR数据集的数据结构

CIFAR是按一个字典的方式进行组织的,的每一个batch包含以下的内容 
1. data:图片的信息,组织成10,000 * 3072的大小,3072就是把原来3* 32 * 32的图片序列化以后的大小,原来32*32的RGB图像按照R、G、B三个通道分别摆放成一个向量,所以恢复的时候会分别恢复出三个通道,在显示图像的时候要merge一下 
2. labels:对应data里面每一个图片,所属的label 
3. batch_label:当前所使用的的batch的编号 
4. filenames:数据集里面每一张图片所对应的的文件名(这个不太重要)

CIFAR的数据集是用python的pickle包进行组织的,要读取数据集,首先要了解pickle的使用方法

3.1用pickle进行数据的序列化,保存到磁盘

pickle.dump( obj, file, protocol )
  •  

obj:你想要序列化的对象 
file:一个指向硬盘上你想要持久化保存的那个对象,一般是一个具有write()方法的文件对象 
protocol:文件序列化的协议,默认为False,就是按ASCII码保存,压缩率比较低;如果为True,就以二进制进行保存,压缩率比较高

3.2用pickle解数据的序列化,读到内存中

obj = pickle.load(file)  

只有一个参数file,这个file是一个具有read方法的文件对象

pickle使用示例

import pickle

test_l = [ '2', 4, 'test' ]
print test_l
pickle.dump(test_l, open("test.txt","w"), False)
test_l_p = pickle.load(open("test.txt","r"))
print test_l_p

读取CIFAR数据集的代码


def LOAD_CIFAR_DATA( filename ):
    with open(filename,'rb') as f:
        dataset = pickle.load(f)
        X = dataset[ 'data' ]
        Y = dataset[ 'labels' ]
        X = np.reshape(X, (10000,3,32,32))
        Y = np.array(Y)
        return X,Y


def LOAD_CIFAR_LABELS(filename):
    with open(filename,'rb') as f:
        obj = pickle.load(f)
        return obj['label_names']

完整示例

import pickle
import cv2
import numpy as np
class ReadData():
    def __init__(self):
        self.label_names = None
        self.X = None
        self.Y = None

    def LOAD_CIFAR_DATA(self, filename):
        with open(filename, 'rb') as f:
            dataset = pickle.load(f)
            print dataset.keys()
            # print len(dataset['filenames'])
            X = dataset['data']
            Y = dataset['labels']
            self.X = np.reshape(X, (10000, 3, 32, 32))
            self.Y = np.array(Y)

    def LOAD_CIFAR_LABELS(self, filename):
        with open(filename, 'rb') as f:
            obj = pickle.load(f)
            print obj
            self.label_names = obj['label_names']

    def Read(self, imgFileName, labelFileName):
        self.LOAD_CIFAR_LABELS(filename=labelFileName)
        self.LOAD_CIFAR_DATA(filename=imgFileName)

    def Show(self):
        example_nums = self.X.shape[0]
        for i in range(example_nums):
            img = self.X[i]
            img_merged = cv2.merge([img[0], img[1], img[2]])
            cv2.imshow("Image", img_merged)
            print self.label_names[self.Y[i]]
            cv2.waitKey(0)


def main():
    readData = ReadData()
    imgFileName = './cifar-10-batches-py/data_batch_2'
    labelFileName = './cifar-10-batches-py/batches.meta'
    readData.Read(imgFileName, labelFileName)
    readData.Show()


if __name__ == '__main__':
    main()
  •  

参考资料

  1. Python中使用pickle持久化对象 oldj.net/article/python-pickle
  2. CS231n课程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值