【百度Paddle】实践作业1——cifar数据集读取

查询API文档,写一个cifar-10数据集的数据读取器,并执行乱序,分批次读取,打印第一个batch数据的shape、类型信息。

【作业内容】

✓代码跑通 请大家根据课上所学内容,补全代码,保证程序跑通。

【评分标准】

✓代码运行成功且有结果(打印第一个batch数据的shape类型信息),100分

具体实现

首先下载cifar-10数据集,

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张测试图像。

下载后解压,将解压后的文件分别上传到AI Studio,因为文件过大,超过上传限制,所以只能分别上传。

代码实现

# 加载飞桨和相关类库
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Linear
import numpy as np
import os
from PIL import Image
import pickle
import random


def unpickle(file):
    with open(file, 'rb') as f:
        dict = pickle.load(f, encoding='bytes')
    return dict


def load_data(mode='train'):
    x = []
    y = []
    if mode == 'train':
        for i in range(1, 6):
            batch_path = 'data_batch_%d' % i
            batch_dict = unpickle(batch_path)
            train_batch = batch_dict[b'data'].astype('float32')
            train_labels = np.array(batch_dict[b'labels'])
            x.append(train_batch)
            y.append(train_labels)
    elif mode == 'test':
        batch_path = 'test_batch'
        batch_dict = unpickle(batch_path)
        train_batch = batch_dict[b'data'].astype('float32')
        train_labels = np.array(batch_dict[b'labels'])
        x.append(train_batch)
        y.append(train_labels)
    else:
        raise Exception("mode can only be one of ['train','test']")
    # 将数据处理为期望的格式
    data = np.reshape(x, [-1, 3, 32, 32]).astype('float32')
    t = np.concatenate(y)
    labels = np.array(t).reshape(-1, 1).astype('float32')
    print("训练数据集数量:", len(data))
    assert len(data) == len(labels), \
        "length of data({}) should be the same as labels({})".format(len(data), len(labels))

    imgs_length = len(data)

    # 定义数据集每个数据的序号
    index_list = list(range(imgs_length))

    # 读入数据时用到的批次大小
    BATCHSIZE = 100

    # 定义数据生成器
    def data_generator():
        # 乱序操作
        if mode == 'train':
            random.shuffle(index_list)
        imgs_list = []
        labels_list = []
        for i in index_list:
            img = data[i]
            label = labels[i]
            imgs_list.append(img)
            labels_list.append(label)
            if (len(imgs_list) == BATCHSIZE):
                yield np.array(imgs_list), np.array(labels_list)
                imgs_list = []
                labels_list = []

        if len(imgs_list) > 0:
            yield np.array(imgs_list), np.array(labels_list)

    return data_generator


train_loader = load_data('train')
for batch_id, data in enumerate(train_loader()):
    image_data, label_data = data
    if batch_id == 0:
        print("打印第一个batch数据的维度:")
        print("图像维度:{}, 标签维度:{}".format(image_data.shape, label_data.shape))

运行结果

训练数据集数量: 50000
打印第一个batch数据的维度:
图像维度:(100, 3, 32, 32), 标签维度:(100, 1)

你可能感兴趣的:(Paddle,python,深度学习)