前言
在这一系列基础课中,我将总结从数据处理到模型调参方方面面的基础知识的讲解。一方面作为自己学习的总结,另一方面给大家分享自己的一些想法和见解。这系列课程将以手写数字识别为基本例子,在此基础上,将这个例子由简到复杂一步一步的改进。
系列课程框架
数据介绍
尽管paddle框架中已经封装好了mnist手写数据集的接口,但是在我们实际项目中,一般需要我们自己区收集数据。这里我提供好了一个mnist数据,数据结构如下:
图片
data包含三个元素的列表:train_set、val_set、 test_set。
- train_set(训练集):包含50000条手写数字图片和对应的标签,用于确定模型参数。
- val_set(验证集):包含10000条手写数字图片和对应的标签,用于调节模型超参数(如多个网络结构、正则化权重的最优选择)。
- test_set(测试集):包含10000条手写数字图片和对应的标签,用于估计应用效果(没有在模型中应用过的数据,更贴近模型在真实场景应用的效果)。
train_set包含两个元素的列表:train_images、train_labels。
- train_imgs:[5000, 784]的二维列表,包含5000张图片。每张图片用一个长度为784的向量表示,内容是28*28尺寸的像素灰度值(黑白图片)。
- train_labels:[5000, ]的列表,表示这些图片对应的分类标签,即0-9之间的一个数字。
数据处理环节
- 读入数据
- 划分数据集
- 生成批次数据
- 训练样本乱序
- 校验数据有效性
一、读入数据
读入数据有许多方法,比如使用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
步骤讲解
- 循环遍历数据,将图片和标签数据进行相应的格式转换
- 将数据分别添加到列表中
- 我们设置的BATCH_SIZE(batch_size)的值为20,当列表的长度达到20时,我们使用一个yield 这个生成器函数 将列表返回
- 清空列表
- 将剩下的值返回
注:比如一共由121条数据,batch_size=20,那么,一共会产生7批次数据(121/20=6、121 % 20=1),最后一批次为1个数据.
四、样本乱序
对于模型来说,越是靠后的数据,对模型的影响最大。所以,在我们进行每一轮训练的时候,需要对数据进行打乱顺序,这样对于会提高我们模型的精准度和泛化能力。
下面介绍一种乱序方法:
list = [i for i in range(len(img))]#增加
np.random