在Matlab2017中,完成一个使用CNN网络进行分类的示例非常简单。为了便于创建图像集,Matlab2015引入了 ImageDatastore对象,实现函数为imageDatastore,该函数可以轻易的完成遍历一个文件夹中的图像建立图像及的功能,不管该文件夹是否含有子文件夹。这也是它区别于imageSet的地方之一。代码如下。

%exam1.m
digitDatasetPath = fullfile(matlabroot,'toolbox','nnet','nndemos',...
    'nndatasets','DigitDataset');
%创建图像集,参数设置为包含子文件夹、子文件夹名作为类标签
digitData = imageDatastore(digitDatasetPath,...
        'IncludeSubfolders',true,'LabelSource','foldernames');
figure;
%取20个置乱数字
perm = randperm(10000,20);
%显示20幅图像
for i = 1:20
    subplot(4,5,i);
    imshow(digitData.Files{perm(i)});
end
trainingNumFiles = 750;
%若报错,可改为rng('default')
rng(1) 
%在图象集每一类中随机取trainingNumFiles个图像作为训练图像,其余作为测试图像
[trainDigitData,testDigitData] = splitEachLabel(digitData,...
                trainingNumFiles,'randomize');
%创建简单CNN网络
layers = [imageInputLayer([28 28 1]);
          convolution2dLayer(5,20);
          reluLayer();
          maxPooling2dLayer(2,'Stride',2);
          fullyConnectedLayer(10);
          softmaxLayer();
          classificationLayer()];
%设置训练参数
options = trainingOptions('sgdm','MaxEpochs',20,...
    'InitialLearnRate',0.0001);
%训练CNN网络
convnet = trainNetwork(trainDigitData,layers,options);
%对测试图像进行分类
YTest = classify(convnet,testDigitData);
%显示测试图像标签
TTest = testDigitData.Labels;