paddlepaddle中的数据读入方式2--样本级的数据输入

本文介绍PaddlePaddle中样本级Reader的使用,通过一个例子展示如何处理数据,使得训练数据每批包含多个样本。内容包括产生训练数据、开始训练的步骤,以及完整程序和运行结果。

题外话:春节假期延长了。向战斗在疫情防控一线的人们致敬。

样本级Reader举例

PaddlePaddle根据Reader返回的数据形式的不同,可分为Batch级的Reader和样本级的Reader
本文通过一个例子讲述样本级Reader的使用方法。
还是以《paddlepaddle中的数据读入方式1–直接输入数据》中的例子为基础,跳过为改动的程序部分。

产生训练数据–给网络准备食物

此处考虑准备较多食物的情景,比如一餐10道“菜”,每道“菜”有4个“盘子”,每个“盘子”里只有1个“食物”。如果这样写:

train_data=numpy.array([
[[1],[2],[3],[4]],#第1道菜
[[2],[4],[6],[8]],#第2道菜
[[3],[6],[9],[12]],#第3道菜
[[4],[8],[12],[16]],#第4道菜
[[5],[10],[15],[20]],#第5道菜
[[6],[12],[18],[24]],#第6道菜
[[7],[14],[21],[28]],#第7道菜
[[8],[16],[24],[32]],#第8道菜
[[9],[18],[27],[36]],#第9道菜
[[10],[20],[30],[40]]]).astype('float32') #第10道菜

由于train_data的shape=(10,4,1),与嘴巴形状不符

x = fluid.data(name="x",shape=[None,1],dtype='float32') 

系统提示:
形状不匹配的错误提示其中一种解决办法就是用Reader把每道“菜”间隔开喂进嘴里。将train_data的赋值语句用下列程序段取代:

def reader():
    for i in range(1,11):
        train_data = numpy.array([i,i*2,i*3,i*4]).reshape(4, 1).astype("float32")  
        yield train_data    # 使用yield来返回单条数据

开始训练–喂食

这部分程序也需要相应改动。

for i in range(3): # 连吃三顿
    print(i)
    m=0
    for data in reader():  #从题库里每次抽出一道题
        if(i==2):
            print(m,data) #显示最后一次喂入的食物()
        m+=1
        outs = exe.run( # 加载主程序运行执行器
        feed={'x':data}, # 从名为x的嘴巴喂入train_data食物
        fetch_list=[y_predict])
# 最后的训练结果
print(outs) # 输出列表仅有一个内容,就是out[0]=y_predict

完整的程序

import paddle.fluid as fluid
import numpy

def reader():
    for i in range(1,11):
        train_data = numpy.array([i,i*2,i*3,i*4]).reshape(4, 1).astype("float32")  
        yield train_data    # 使用yield来返回单条数据

x = fluid.data(name="x",shape=[None,1],dtype='float32') # 嘴巴的shape容纳了食物的shape。

y_predict = fluid.layers.fc(input=x,size=1,act=None)

cpu = fluid.core.CPUPlace() # 在cpu上操作
exe = fluid.Executor(cpu)
exe.run(fluid.default_startup_program()) # 运行执行器初始化网络参数(采用默认的初始化程序)

for i in range(3): # 连吃三顿
    print(i) # i表示第几顿
    m=0 # m表示第几道
    for data in reader():  #每顿吃10道“菜”,每口只喂1道“菜”
        if(i==2):
            print(m,data) #显示最后一顿的菜谱
        m+=1
        outs = exe.run( # 加载主程序运行执行器
        feed={'x':data}, # 从名为x的嘴巴喂入reader端上的食物
        fetch_list=[y_predict])
# 最后的训练结果
print(outs) # 输出列表仅有一个内容,就是out[0]=y_predict

运行结果

在这里插入图片描述

### 数据集格式要求 对于百度飞桨(PaddlePaddle),训练模型所需的数据集通常遵循一定的结构化格式,以便能够被高效读取和处理。具体来说: #### 文件组织形式 数据集应当按照特定的方式进行文件夹划分。一般情况下,图像分类任务中的数据集会被分为多个子目录,每个子目录代表一类标签下的所有样本图片。例如,在一个有猫狗两类别的简单例子中,可能会存在两个文件夹分别命名为`cat` 和 `dog` ,里面存放着各自类别的图像文件。 #### 数据增强与预处理 为了提高泛化能力并增加有效样本数量,可以在加载阶段实施一些常见的图像变换操作如随机裁剪、翻转等作为数据增强手段。此外,还需要做标准化处理使输入特征具有零均值单位方差特性,这有助于加速收敛过程[^1]。 #### 训练/验证/测试集分割 合理分配不同用途的数据集合非常重要。一般来说,原始采集到的大规模无标注资料经过初步筛选后可进一步划分为三个部分:80%用作训练集来调整网络参数;10%-20%留作验证集用于超参数优化期间评估性能表现;剩余约10%构成独立的测试集以最终衡量整个系统的准确性[^3]。 #### 批量读入机制 考虑到内存占用等因素的影响,实际应用过程中往往不会一次性把全部数据载入RAM而是采用批量方式逐步供给给神经网络学习。通过设定合适的批尺寸(batch size),既能在一定程度上缓解硬件资源压力又不影响正常运算流程[^2]。 ```python from paddle.io import Dataset import os from PIL import Image class CustomImageDataset(Dataset): def __init__(self, root_dir, transform=None): self.root_dir = root_dir self.transform = transform self.image_paths = [] # 遍历根目录下各个类别文件夹内的图片路径 for label_name in sorted(os.listdir(root_dir)): class_path = os.path.join(root_dir, label_name) if not os.path.isdir(class_path): continue for img_file in os.listdir(class_path): self.image_paths.append((os.path.join(class_path, img_file), label_name)) def __len__(self): return len(self.image_paths) def __getitem__(self, idx): image_filepath, label = self.image_paths[idx] image = Image.open(image_filepath).convert('RGB') if self.transform is not None: image = self.transform(image) labels_map = {"label_a": 0, "label_b": 1} # 假设有两类别a,b映射成整型编号 numeric_label = labels_map[label] return image, numeric_label ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值