这个例子展示了如何为深度学习分类创建和训练一个简单的卷积神经网络。卷积神经网络是深度学习的重要工具,尤其适用于图像识别。
这个例子演示了如何:
加载和浏览图像数据。
定义网络架构。
指定培训选项。
训练网络。
预测新数据的标签并计算分类精度。
将数字样本数据加载为图像数据存储。imageDatastore
根据文件夹名称自动标记图像,并将数据存储为ImageDatastore
对象。图像数据存储使您能够存储大型图像数据,包括不适合内存的数据,并在卷积神经网络的训练期间有效地读取批量图像。
digitDatasetPath = fullfile(matlabroot,“工具箱”,“nnet”,“nndemos”,…“nndatasets”,“DigitDataset”);imds = imageDatastore(digitDatasetPath,…“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);
显示数据存储中的一些图像。
图;烫发= randperm(10000,20);为I = 1:20 subplot(4,5, I);imshow (imds.Files{烫发(i)});结束
计算每个类别中的图像数量。labelCount
是一个包含标签和具有每个标签的图像数量的表。数据存储为数字0-9中的每个数字包含1000个图像,总共10000个图像。您可以将网络的最后一个完全连接层中的类数量指定为OutputSize
论点。
labelCount = countEachLabel(imds)
labelCount =10×2表标签计数_____ _____ 0 1000 1 1000 2 1000 3 1000 4 1000 5 1000 6 1000 7 1000 8 1000 9 1000
您必须在网络的输入层中指定图像的大小。检查第一张图片的大小digitData
。每张图像都是28 × 28 × 1像素。
Img = readimage(imds,1);大小(img)
ans =1×228日28日
将数据分为训练数据集和验证数据集,使训练集中的每个类别包含750张图像,验证集包含每个标签的剩余图像。splitEachLabel
拆分数据存储digitData
到两个新的数据存储中,trainDigitData
和valDigitData
。
numTrainFiles = 750;[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,“随机”);
定义卷积神经网络架构。
layers = [imageInputLayer([28 28 1])卷积2dlayer (3,8,“填充”,“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(2,“步”2) convolution2dLayer(16日“填充”,“相同”) batchNormalizationLayer reluLayer maxPooling2dLayer(2,“步”32岁的,2)convolution2dLayer (3“填充”,“相同”) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer classificationLayer];
图像输入层一个imageInputLayer
是指定图像大小的地方,在本例中是28 × 28 × 1。这些数字对应于高度、宽度和通道大小。数字数据由灰度图像组成,因此通道大小(彩色通道)为1。对于彩色图像,通道大小为3,对应于RGB值。您不需要打乱数据,因为trainNetwork
默认情况下,在训练开始时对数据进行洗牌。trainNetwork
也可以自动洗牌数据在每个epoch的开始训练期间。
卷积的层在卷积层,第一个参数是filterSize
,这是训练函数在沿着图像扫描时使用的过滤器的高度和宽度。在本例中,数字3表示过滤器大小为3 × 3。您可以为过滤器的高度和宽度指定不同的大小。第二个参数是过滤器的数量,numFilters
即连接到输入的同一区域的神经元数量。该参数决定了特征映射的数量。使用“填充”
名称-值对,以向输入特征映射添加填充。对于一个默认步长为1的卷积层,“相同”
填充确保空间输出大小与输入大小相同。您还可以使用的名称-值对参数定义该层的步幅和学习率convolution2dLayer
。
批归一化层批归一化层对网络中传播的激活和梯度进行归一化,使网络训练成为一个更容易的优化问题。在卷积层和非线性层(如ReLU层)之间使用批处理归一化层,以加速网络训练并降低对网络初始化的敏感性。使用batchNormalizationLayer
创建一个批处理规范化层。
ReLU层批归一化层之后是一个非线性激活函数。最常见的激活函数是整流线性单元(ReLU)。使用reluLayer
创建一个ReLU层。
最大池化层卷积层(带有激活函数)之后有时会进行下采样操作,以减小特征映射的空间大小并去除冗余的空间信息。下采样可以在不增加每层所需计算量的情况下增加更深卷积层中的滤波器数量。下采样的一种方法是使用最大池,您可以使用maxPooling2dLayer
。最大池化层返回输入矩形区域的最大值,由第一个参数指定,poolSize
。在本例中,矩形区域的大小为[2,2]。的“步”
名称-值对参数指定训练函数沿输入扫描时所采取的步长。
全连接层卷积层和下采样层之后是一个或多个完全连接层。顾名思义,全连接层是指神经元与前一层的所有神经元连接在一起的层。这一层结合了图像上前一层学习到的所有特征,以识别更大的模式。最后一个完全连接层结合特征对图像进行分类。因此,OutputSize
参数等于目标数据中的类数。在本例中,输出大小为10,对应于10个类。使用fullyConnectedLayer
创建一个完全连接的图层。
Softmax层softmax激活函数将全连通层的输出归一化。softmax层的输出由和为1的正数组成,这些正数可以被分类层用作分类概率。创建一个softmax图层softmaxLayer
最后一个完全连接层之后的功能。
分类层最后一层是分类层。这一层使用softmax激活函数为每个输入返回的概率将输入分配给互斥类之一并计算损失。要创建分类层,请使用classificationLayer
。
定义网络结构后,指定培训选项。使用随机动量梯度下降(SGDM)训练网络,初始学习率为0.01。将最大epoch数设置为4。epoch是对整个训练数据集的完整训练周期。通过指定验证数据和验证频率,在训练期间监控网络的准确性。每个epoch对数据进行洗牌。该软件利用训练数据对网络进行训练,并在训练过程中定期计算验证数据的准确率。验证数据不用于更新网络权重。打开训练进度图,关闭命令窗口输出。
options = trainingOptions(“个”,…“InitialLearnRate”, 0.01,…“MaxEpochs”4…“洗牌”,“every-epoch”,…“ValidationData”imdsValidation,…“ValidationFrequency”30岁的…“详细”假的,…“阴谋”,“训练进步”);
定义的体系结构训练网络层
、训练数据和训练选项。默认情况下,trainNetwork
如果有可用的GPU,则使用GPU(需要Parallel Computing Toolbox™和具有计算能力3.0或更高版本的CUDA®支持GPU)。否则,使用CPU。方法指定执行环境“ExecutionEnvironment”
的名称-值对参数trainingOptions
。
训练进度图显示了小批损失和准确性以及验证损失和准确性。有关训练进度图的更多信息,请参见监控深度学习训练进度。损失是交叉熵损失。准确率是指网络正确分类的图像的百分比。
net = trainNetwork(imdsTrain,layers,options);
使用训练好的网络预测验证数据的标签,并计算最终的验证精度。准确度是网络正确预测的标签的比例。在这种情况下,超过99%的预测标签与验证集的真实标签匹配。
YPred = classification (net,imdsValidation);YValidation = imdsValidation.Labels;accuracy = sum(YPred == YValidation)/numel(YValidation)
精度= 0.9988
analyzeNetwork
|深度网络设计器|trainingOptions
|trainNetwork