综述
在大数据和人工智能时代,深度学习是一种最为常见的数据分析和拟合工具。本报告以常用分析软件Matlab为例,介绍如何通过编写代码实现一个简单的CNN卷积神经网络。
Step 1: 打开matlab,新建脚本
1、安装matlab 2018以上版本后,双击图标打开。
2、点击“编辑器”页面,点击左上角的“新建”-“脚本”
3、保存脚本到默认路径(建议不要改路径!!),起一个你喜欢的名字(例如CVhandWritingDigits)
Step 2: 读入数据
1、按照下图编写代码,读入数据
每写完一行代码,建议运行一下,确保没有错误,再往下写。
图中“…”表示这行代码太长了,要分开两行。一直到第二行出线“;”,代表这行代码完了。
“%”代表注释内容,可以不写上去。
运行后,没有报错,工作区出线这些变量和赋值,可以往下做了。
2、显示部分数据
运行后,得到下图结果
3、显示所有标签,及每个标签中的数据量
运行后,得到如下结果
4、查看图像的大小
运行后,得到如下结果
5、划分训练集和测试集
Step 3: 配置卷积神经网络
1、编写以下代码,配置CNN的每一层
2、设置模型训练的参数options
3、开始训练模型
运行后,弹出如下窗口,我们可以观看模型在训练过程中loss和accuracy的变化
最后在验证集的准确率上达到99.52%。
Step 4: 在验证集上进行验证
1、将验证集放在指定路径下,例如D盘根目录下。然后对验证集进行数据整理。
2、将训练好的模型,应用于验证数据集上。
运行代码后,得到如下结果。
同学们可以进行思考,为什么在训练时得到的准确率是99.62%,而此时在验证集上的验证集仅为60%?
3、可视化结果
运行代码后,得到如下结果。
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', 'nndemos', ...
'nndatasets', 'DigitDataset');
imds = imageDatastore(digitDatasetPath, ...
'IncludeSubfolders', true, 'LabelSource', 'foldernames');
% 加载手写数字数据集,imageDatastore根据文件夹名称自动标记图像,
% 并将数据存储为imageDatastore对象
figure;
perm = randperm(10000, 20);
for i = 1:20
subplot(4, 5, i);
imshow(imds.Files{perm(i)})
end
countEachLabel(imds)
img = readimage(imds, 1);
size(img)
% 查看图像的大小,每个图像为28*28*1像素;1代表为黑白。
numTrainFiles = 750;
[imdsTrain, imdsTest] = splitEachLabel(imds, numTrainFiles, 'randomized');
% 将数据集划分为训练和测试数据集,随机选取每个标签中的750个图像放入训练集中,
% 测试集包含每个标签的剩余图像。
% 以下为设置CNN的各个层结构
layers = [
imageInputLayer([28 28 1]) % 图像输入层,指定输入图像的尺寸
convolution2dLayer(3, 8, 'Padding', 'same')
% 8个大小为3*3的卷积核。padding为补0策略
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'stride', 2)
% 池化层,stride为步幅大小;本例中是2*2的池化层,步幅为2
convolution2dLayer(3, 16, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'stride', 2)
convolution2dLayer(3, 32, 'Padding', 'same')
batchNormalizationLayer
reluLayer
maxPooling2dLayer(2, 'stride', 2)
fullyConnectedLayer(10) % 全连接层。输出大小为10,对应10个标签
softmaxLayer % softmax作为最后一层的分类器
classificationLayer
];
options = trainingOptions('sgdm', ... % 随机梯度下降
'InitialLearnRate', 0.01, ... % 学习率
'MaxEpochs', 4, ... % epoch为整个训练数据集的完整训练周期
'Shuffle', 'every-epoch', ...
'ValidationData', imdsTest, ... % 测试集
'ValidationFrequency', 30, ...
'Verbose', false, ...
'Plots', 'training-progress'); % 查看训练过程
net = trainNetwork(imdsTrain, layers, options); % 开始训练
save 'CSNet.mat' net % 保存结果
mineSet = imageDatastore('D:\hw22\hw22\', 'FileExtensions', '.jpg', ...
'IncludeSubfolders', false); % 指定验证集的位置,是一套新的数据
mLabels = cell(size(mineSet.Files, 1), 1); % 标记数据
for i = 1:size(mineSet.Files, 1)
[filepath, name, ext] = fileparts(char(mineSet.Files{i}));
mLabels{i, 1} = char(name);
end
mLabels2 = categorical(mLabels);
mineSet.Labels = mLabels2;
[YPred, probs] = classify(net, mineSet); % 利用训练好的模型,预测验证集的标签
YValidation = mineSet.Labels;
accuracy = sum(YPred == YValidation) / numel(YValidation) % 计算验证集的准确率
figure; % 画图,在验证集中随机挑10张,把真值和预测值标出来
nSample = 10;
ind = randperm(size(YPred, 1), nSample);
for i = 1:nSample
subplot(2, fix((nSample + 1) / 2), i)
imshow(char(mineSet.Files(ind(i))))
title(['PRE' char(YPred(ind(i)))])
if char(YPred(ind(i))) == char(YValidation(ind(i)))
xlabel(['PRE:' char(YValidation(ind(i)))], 'Color', 'b')
else
xlabel(['PRE:' char(YValidation(ind(i)))], 'color', 'r')
end
end