利用飞桨查询cifar-10 数据集,并执行乱序,分批次读取,打印第一个batch数据的shape、类型信息

查询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)

你可能感兴趣的:(Paddle飞桨,Python,python,人工智能,paddlepaddle)