购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

案例1
巧妇难为无米之炊:数据集的制作与加载

机器学习是一种数据驱动的技术,俗话说“巧妇难为无米之炊”,没有数据的支撑,机器学习便无从谈起。深度学习是机器学习的一个重要分支,数据对深度学习同样起着非常重要的作用。

1.1 机器学习中的数据集

机器学习的本质是从数据中确定模型参数并利用训练好的参数进行数据处理,其基本实现流程如图1-1所示。

图1-1 机器学习的基本实现流程

“数据决定了机器学习的上限,而模型和算法只是逼近这个上限。”由此可见,数据对于整个机器学习项目至关重要。

注意

数据集中或多或少都会存在部分缺失、分布不均衡、分布异常、混有无关紧要的数据等问题。这就需要对收集到的数据进行进一步的处理,这样的步骤叫作“数据预处理”。

在机器学习中,一般将数据集划分为两大部分:一部分用于模型训练,称作训练集(Train Set);另一部分用于模型泛化能力评估,称作测试集(Test Set)。在模型训练阶段会将训练集再次划分为两部分,一部分用于模型的训练,而另外一部分用于交叉验证,称作验证集(Validation Set),如图1-2所示。

图1-2 训练集、验证集和测试集的示意图

如图1-3所示,对训练集、测试集、验证集可以有如下的理解:学生课本中的例题即训练集;老师布置的作业、月考等都可以算作是验证集;高考为测试集。学生上课过程中所学习到的知识以及课上做的练习题就是模型训练的过程。

图1-3 对训练集、测试集、验证集的形象理解

1.2 如何加载MATLAB自带的数据集

【例1-1】 添加MATLAB自带的mnist手写数据集。

mnist数据集是开源手写数据集,其含有0~9总共10种手写数字,分别保存在以数字0~9命名的10个文件夹中,每个文件夹中有1000幅图像,总共10000幅图像。

在安装MATLAB之后,该数据集会被自动加载,其所在的路径如图1-4所示(MATLAB的版本不同,安装的路径不同,mnist数据集所在的路径也会有所不同,请读者以计算机上安装后的实际路径为准)。

图1-4 mnist数据集所在的路径

在命令窗口中输入如下指令,可以加载mnist数据集:

其中,digitDatasetPath存放mnist数据集路径;imageDatastore函数生成一个图像数据存储区结构体,里面包含了图像和每幅图像对应的标签。

上述指令涉及两个函数:fullfile和imageDatastore,下面就对这两个函数进行详细讲解。

1.fullfile函数

功能: 创建路径。

用法: f = fullfile(filepart1,…,filepartN)。

输入: filepart1,…,filepartN表示第1层路径(文件夹),…,第N层路径(文件夹或文件名)。

输出: f表示完整的路径。

例如, f = fullfile(' DLTfolder ',' DLTsubfolder ',' DLTfile.m')的功能是生成一个路径f,f ='DLTfolder\DLTsubfolder\DLTfile.m'。

经验分享

在Windows系统中,也可以用fullfile函数创建多个文件的路径。例如,f = fullfile(' c:\',' myfiles','matlab ',{ 'myfile1.m' ;' myfile2.m '}),该命令语句的功能是返回一个元胞数组f,其中包含文件myfile1.m和myfile2.m的路径。

即f=2×1 cell array

'c:\myfiles\matlab\myfile1 .m'

'c:\myfiles\matlab\myfile2 .m'

2.imageDatastore函数

功能: 将图像样本存储为可供训练和验证的数据。

用法:

语法①

imds = imageDatastore (location)

输入: location表示图像数据保存的位置。

输出: imds表示可供训练和验证的数据。

语法②

imds = imageDatastore (location,Name,Value)

可以通过指定“名称-取值”对(Name和Value)来配置特定属性(将每种属性名称括在单引号中),具体含义见表1-1。

表1-1 imageDatastore函数的输入参数

在了解了上述两个函数的功能和用法之后,下面详细地看一下这两个命令语句的含义:

上述语句创建了一个路径,在笔者的计算机上,该路径为:

在创建了路径之后,将存储在该路径之下的图像集转化为可用的训练及验证数据集;采用的具体命令语句如下。

例程1-1:读取自带的mnist手写数据集。

读取MATLAB自带的mnist手写数据集,并随机显示其中的20幅图像。请读者结合上述的讲解对程序进行理解。例程1-1的运行效果如图1-5所示。

图1-5 例程1-1的运行效果

在使用imageDatastore函数时,还有一点要注意,如果图像数据集在C盘的\Documents\MATLAB\文件夹下(注:MATLAB安装在不同的位置,路径可能不同),调用该函数时第一个参数可以不加路径,直接写文件夹的名称。如:

上述语句实现的功能为,将存储在C盘的\ Documents\ MATLAB\ MerchData文件夹下的图像集转化为可用的训练及验证数据集。

1.3 如何加载自己制作的数据集

【例1-2】 加载自己制作的数据集。

在本书的随书附赠网盘资料中,有一个简单的图像集(名为animal samples的文件夹,该文件夹下有一个子文件夹,文件夹名分别为goldfish,文件夹下有10张图片,如图1-6所示),将该图像集导入MATLAB的工作区中,其步骤如下。

步骤1: 将名为animal samples的文件夹复制到C盘的\ Documents\ MATLAB的文件夹中(注:MATLAB安装在不同的位置,路径可能不同)。

步骤2: 在MATLAB的命令窗口输入如下指令语句。

通过上述步骤1、步骤2便可以将自己制作的数据集导入MATLAB的工作区中,以供后续卷积神经网络训练及验证使用。

图1-6 名为animal samples的简单图像集

例程1-2: 如何加载自己制作的数据集。

读取animal samples数据集(已将其放到C盘的\ Documents\ MATLAB的文件夹中),并随机显示其中的6幅图像。请读者结合上述的讲解对程序进行理解。例程1-2的运行效果如图1-7所示。

图1-7 例程1-2的运行效果

1.4 如何加载公开数据集:以CIFAR-10为例

CIFAR-10数据集由10个类(飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船、卡车)的60000个32×32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。CIFAR-10数据集及其分类示意图如图1-8所示。

【例1-3】 如何下载CIFAR-10数据集并导入MATLAB工作空间。

步骤1: 下载CIFAR-10数据集。CIFAR-10数据集的下载地址为https://www.cs.toronto.edu/~kriz/cifar-10-MATLAB.tar.gz。

步骤2: 下载之后,CIFAR-10数据集为cifar-10-batches-mat,在C盘的\ Documents\ MAT-LAB的文件夹(注:以读者安装MATLAB的实际路径为准)之中新建一个名为cifar10 Data的文件夹,将cifar-10-batches-mat放到该文件夹下面,如图1-9所示。

图1-8 CIFAR-10数据集及其分类示意图

图1-9 新建cifar10 Data文件夹并将cifar-10-batches-mat放到该文件夹下

步骤3: 新建一个名为helperCIFAR10 Data.m的文件,将如下代码输入,并保存,该代码的功能是将CIFAR-10数据集下载并导入,在本节中不作详细讲解。

步骤4: 在MATLAB的命令窗口中,输入如下程序代码。

上述程序代码实现了导入CIFAR-10数据集并随机显示其中100幅图像的功能。显示效果如图1-10所示。

图1-10 随机显示的CIFAR-10数据集中的100幅图像

1.5 如何划分训练集与验证集

前面介绍了如何加载数据集,在加载数据集之后,需要将数据集划分为训练集和验证集。在MATLAB深度学习工具箱中,提供了splitEachLabel函数将数据存储区中的数据集划分为训练集和验证集,具体使用方法如下。

函数: splitEachLabel。

功能: 将数据存储区中的数据集划分为训练集和验证集。

用法: [ds1,ds2 ] = splitEachLabel(imds,p)。

输入: imds表示图像样本数据,p表示数据集中用于训练深度网络的样本比例或数量。

输出: ds1用于训练的样本数据,ds2用于验证的样本数据。

注意

splitEachLabel函数默认是按顺序对样本数据集进行划分的,可以添加选项'random-ized'来进行随机划分。

例如, [imdsTrain,imdsValidation] = splitEachLabel(imds,750,'randomize')。

实现的功能是随机将样本数据imds中的750个样本数据划分为训练样本数据。

实现的功能是随机将样本数据imds中70%的样本数据划分为训练样本数据。

1.6 如何扩充数据样本集

数据的丰富程度对于深度学习来说至关重要,可以通过对原始图像进行一定变换得到新的图像数据,进而扩充图像数据集。数据集的扩充操作有助于防止网络过拟合,提高网络的泛化能力。可以利用MATLAB函数,在原始数据集的基础上,通过对原始图像进行调整大小、旋转和翻转等操作来扩充数据集。 77mgfSaOcHWoLPGjgSjFbu/rE193zMrfu7k3Rvwhu7+w/EmMnvLKITUkCn+HD4P0

点击中间区域
呼出菜单
上一章
目录
下一章
×