查询API文档,写一个cifar-10数据集的数据读取器,并执行乱序,分批次读取,打印第一个batch数据的shape、类型信息的感想总结:
代码如下:
# 加载飞桨和相关数据处理的库
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Linear
import numpy as np
import os
import gzip
import json
import random
train_set = paddle.dataset.cifar.train10()
train_reader = paddle.batch(train_set,batch_size=1)
train_data = []
train_label = []
for batch_id, data in enumerate(train_reader()):
# 获得图像数据,并转为float32类型的数组
img_data = np.array([x[0] for x in data]).astype('float32')
# 获得图像标签数据,并转为float32类型的数组
label_data = np.array([x[1] for x in data]).astype('float32')
# 打印数据形状
#print("图像数据形状和对应数据为:", img_data.shape, img_data[0])
#print("图像标签形状和对应数据为:", label_data.shape, label_data[0])
train_data.append(img_data)
train_label.append(label_data)
# 打印数据形状
print("图像数据形状和对应数据为:", np.shape(train_data),len(train_data)) #(50000, 1, 3072) 50000
print("图像标签形状和对应数据为:", np.shape(train_label)) #(50000, 1) 50000
运行结果:
图像数据形状和对应数据为: (50000, 1, 3072) 50000
图像标签形状和对应数据为: (50000, 1)
根据API文档,cifar数据集:
可以从 https://www.cs.toronto.edu/~kriz/cifar.html 下载数据集,并将训练集和测试集解析为paddle reader creator。
cifar-10数据集由10个类别的60000张32x32彩色图像组成,每个类别6000张图像。共有5万张训练图像,1万张测试图像。
cifar-100数据集与cifar-10类似,只是它有100个类,每个类包含600张图像。每个类有500张训练图像和100张测试图像。
故 cifar-10图像是大小为33232的RGB图像。
# 数据集相关参数,图片高度IMG_ROWS, 图片宽度IMG_COLS
IMG_ROWS = 32
IMG_COLS = 32
# 获得数据集长度
imgs_length = len(train_data)
# 定义数据集每个数据的序号,根据序号读取数据
# 也可以根据API文档获得数据集图像数量
index_list = list(range(imgs_length))
# 读入数据时用到的批次大小
BATCHSIZE = 100
# 随机打乱训练数据的索引序号
random.shuffle(index_list)
# 定义数据生成器,返回批次数据
def data_generator():
imgs_list = []
labels_list = []
for i in index_list:
# 将数据处理成期望的格式,比如类型为float32,shape为[3,32,32]
img = np.reshape(train_data[i], [3, IMG_ROWS, IMG_COLS]).astype('float32')
label = np.reshape(train_label[i], [1]).astype('float32')
imgs_list.append(img)
labels_list.append(label)
if len(imgs_list) == BATCHSIZE:
# 获得一个batchsize的数据,并返回
yield np.array(imgs_list), np.array(labels_list)
# 清空数据读取列表
imgs_list = []
labels_list = []
# 如果剩余数据的数目小于BATCHSIZE,
# 则剩余数据一起构成一个大小为len(imgs_list)的mini-batch
if len(imgs_list) > 0:
yield np.array(imgs_list), np.array(labels_list)
return data_generator
# 声明数据读取函数,从训练集中读取数据
# data_generator()函数将全部数据集分块,但我们只取第一个Batch
train_loader = data_generator
# 以迭代的形式读取数据
for batch_id, data in enumerate(train_loader()):
image_data, label_data = data
if batch_id == 0:
# 打印数据shape和类型
print("打印第一个batch数据的维度:")
print("图像维度: {}, 标签维度: {}".format(image_data.shape, label_data.shape))
break
运行结果:
打印第一个batch数据的维度:
图像维度: (100, 3, 32, 32), 标签维度: (100, 1)