飞浆PaddlePaddle-百度架构师手把手带你零基础实践深度学习——21日学习打卡(第一周第三日)

百度架构师手把手带你零基础实践深度学习——21日学习打卡(第一周第三日)
首先声明,不详细讲解代码部分,主要是针对课程的理解及对作业的分析。(要是有代码相关问题可以私信)
在这里插入图片描述
今天毕然老师是围绕着一个经典案例【手写数字识别】展开来讲的,模型方面从房价预测模型过渡到手写体识别模型,依旧使用了Linear()函数定义一层全连接,中间部分讲述了使用“横纵式”教学法中的纵向极简方案快速完成手写数字识别任务的建模,但效果不行,所以后来改用横向展开,进行逐个环节优化。下面是结构图,方便记忆。紧接着讲解了对数据的“预处理”,如何通过分析数据来拆分为训练集、测试集。
本节课我觉得重点的地方在于对同步读取数据和异步读取数据的理解,课上毕然老师讲的比较简单,最好课后自己两个模式都好好训练一下,便于理解。(今天的作业就是代码实践,所以我就不写这两个模式的模型了。)

作业

  • 本着给大家解惑的想法,给出答案解析,大家放心,第一个满分一定是我这篇博文发出之前的哦~
    今天的作业是实践作业,哦吼,我们终于能敲敲键盘啦~
    本人水平有限,代码质量欢迎大家斧正~
  • 首先我尝试打印第一个batch数据的shape、类型信息。代码如下:
import paddle
import numpy as np
import random

# 设置数据读取器,读取cifar-10数据训练集
trainset = paddle.dataset.cifar.train10(cycle=False)
# 包装数据读取器,每次读取的数据数量设置为batch_size=100
train_reader = paddle.batch(trainset, batch_size=100)
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')
    break
img, label = img_data, label_data
index_list = list(range(len(img))
batchsize=100
def data_generator():

    img_list = []
    label_list = []
    for i in index_list:
        # 处理数据
        img_ = np.reshape(img[i], [3, 32, 32]).astype('float32')
        label_ = np.reshape(label[i], [1]).astype('float32')
        img_list.append(img_) 
        label_list.append(label_)
        if len(img_list) == batchsize:
            # 返回一个batchsize的数据
            yield np.array(img_list), np.array(label_list)
            # 清空列表
            img_list = []
            label_list = []
    # 如果剩余数据的数目小于batchsize,则剩余数据一起构成一个大小为len(img_list)的mini-batch
    if len(img_list) > 0:
        yield np.array(img_list), np.array(label_list)
    return data_generator

# 从训练集中读取数据
train_loader = data_generator
# 读取数据
for batch_id, data in enumerate(train_loader()):
    image_data, label_data = data
    if batch_id == 0:
        # 打印数据shape和类型
        print("打印第一个batch数据的shape和类型:")
        print("图像维度: {}, 标签维度: {}".format(image_data.shape, label_data.shape))
    break

运行效果很好的嘛:

打印第一个batch数据的shape和类型:
图像维度: (100, 3, 32, 32), 标签维度: (100, 1)
  • 接下来就考虑乱序问题,这道题完整代码如下:
import paddle
import numpy as np
import random

# 设置数据读取器,读取cifar-10数据训练集
trainset = paddle.dataset.cifar.train10(cycle=False)
# 包装数据读取器,每次读取的数据数量设置为batch_size=100
train_reader = paddle.batch(trainset, batch_size=100)
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')
    break
img, label = img_data, label_data
img_length = len(img)
index_list = list(range(img_length))
#乱序乱序乱序
random.shuffle(index_list)
batchsize=100
def data_generator():

    img_list = []
    label_list = []
    for i in index_list:
        # 处理数据
        img_ = np.reshape(img[i], [3, 32, 32]).astype('float32')
        label_ = np.reshape(label[i], [1]).astype('float32')
        img_list.append(img_) 
        label_list.append(label_)
        if len(img_list) == batchsize:
            # 返回一个batchsize的数据
            yield np.array(img_list), np.array(label_list)
            # 清空列表
            img_list = []
            label_list = []
    # 如果剩余数据的数目小于batchsize,则剩余数据一起构成一个大小为len(img_list)的mini-batch
    if len(img_list) > 0:
        yield np.array(img_list), np.array(label_list)
    return data_generator

# 从训练集中读取数据
train_loader = data_generator
# 读取数据
for batch_id, data in enumerate(train_loader()):
    image_data, label_data = data
    if batch_id == 0:
        # 打印数据shape和类型
        print("打印第一个batch数据的shape和类型:")
        print("图像维度: {}, 标签维度: {}".format(image_data.shape, label_data.shape))
    break

最后结果:

打印第一个batch数据的shape和类型:
图像维度: (100, 3, 32, 32), 标签维度: (100, 1)

希望对大家有帮助,有什么改进的地方还请评论。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhu_rui/article/details/107982824