paddle深度学习基础之数据处理以及优化

这篇博客介绍了在Paddle深度学习框架中,如何进行数据处理,包括读取JSON数据、数据集划分、批次生成、样本乱序以及数据有效性检验。此外,还讨论了异步数据读取以提升效率。
摘要由CSDN通过智能技术生成

前言

在这一系列基础课中,我将总结从数据处理到模型调参方方面面的基础知识的讲解。一方面作为自己学习的总结,另一方面给大家分享自己的一些想法和见解。这系列课程将以手写数字识别为基本例子,在此基础上,将这个例子由简到复杂一步一步的改进。

系列课程框架

img

数据介绍

尽管paddle框架中已经封装好了mnist手写数据集的接口,但是在我们实际项目中,一般需要我们自己区收集数据。这里我提供好了一个mnist数据,数据结构如下:

图片

data包含三个元素的列表:train_setval_settest_set

  • train_set(训练集):包含50000条手写数字图片和对应的标签,用于确定模型参数。
  • val_set(验证集):包含10000条手写数字图片和对应的标签,用于调节模型超参数(如多个网络结构、正则化权重的最优选择)。
  • test_set(测试集):包含10000条手写数字图片和对应的标签,用于估计应用效果(没有在模型中应用过的数据,更贴近模型在真实场景应用的效果)。

train_set包含两个元素的列表:train_imagestrain_labels

  • train_imgs:[5000, 784]的二维列表,包含5000张图片。每张图片用一个长度为784的向量表示,内容是28*28尺寸的像素灰度值(黑白图片)。
  • train_labels:[5000, ]的列表,表示这些图片对应的分类标签,即0-9之间的一个数字。

数据处理环节

  1. 读入数据
  2. 划分数据集
  3. 生成批次数据
  4. 训练样本乱序
  5. 校验数据有效性

一、读入数据

读入数据有许多方法,比如使用open()打开文件读取内容、使用numpy.fromfile()方法、pandas.read_csv()方法 都可以。由于此次数据是以json文件存储的,所以我们使用json.load()方法.

``

import gzip #解压缩包,python自带的包
import json #加载json文件使用的
import numpy as np

mnistdata = gzip.open('data/mnist.json.gz')#解压缩文件
data = json.load(mnistdata)#加载json文件

此时data是一个数组,咱们转化为numpy类型,并查看一下他的形状

``

data = np.array(data)
print(data.shape)

[out] : (3, 2)

二、划分数据集

结果输出的形状与咱们上面介绍的data数据结构一致,三行数组分别是训练集、验证集、测试集。两列分别是 图片数据、标签数据。接下来通过多重赋值的方式,获取这三个数据集

#分别获取训练集、验证集和测试集数据
train_data,val_data,test_data = data

以训练集为例,获取其图片和标签数据

img = train_data[0] #图片数据
label = train_data[1] #标签数据

三、生成批次数据

这里需要明白两个概念,就是python中的迭代器和生成器。不清楚的先去补课

我们在使用深度学习框架向模型传入数据时,经常会简单BATCH_SIZI 这个参数。这个就是指定一批次数据的个数。这么做的最大好处就是节约内存。可能我们平常使用的数据量比较小,没太感觉。当我们使用几千万条数据进行训练时,如果一股脑的将数据一下子读取到内存中,那占据的空间就非常的大。所以我们采取批量处理的方式

#设置图片大小
IMG_ROWS=28
IMG_COLS=28
def data_genergator(batch_size=20):
        listdata=[]
        listlabel=[]
        for i in range(len(img)):
            #转化数据结构
            imgdata = np.reshape(img[i],[1,IMG_ROWS,IMG_COLS]).astype('float32')
            labeldata = np.reshape(label[i],[1]).astype('float32')
            listdata.append(imgdata)
            listlabel.append(labeldata)
            if(len(listdata)%batch_size==0):
                yield np.array(listdata),np.array(listlabel)
                listlabel=[]
                listdata=[]
        if(len(listdata)>0):
            yield np.array(listdata),np.array(listlabel)

    return data_genergator

步骤讲解

  1. 循环遍历数据,将图片和标签数据进行相应的格式转换
  2. 将数据分别添加到列表中
  3. 我们设置的BATCH_SIZE(batch_size)的值为20,当列表的长度达到20时,我们使用一个yield 这个生成器函数 将列表返回
  4. 清空列表
  5. 将剩下的值返回

注:比如一共由121条数据,batch_size=20,那么,一共会产生7批次数据(121/20=6、121 % 20=1),最后一批次为1个数据.

四、样本乱序

对于模型来说,越是靠后的数据,对模型的影响最大。所以,在我们进行每一轮训练的时候,需要对数据进行打乱顺序,这样对于会提高我们模型的精准度和泛化能力。

下面介绍一种乱序方法:


list = [i for i in range(len(img))]#增加
np.random
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值