MATLAB Self-Paced Online Courses
Deep Learning Onramp
文章目录
Introduction
使用MATLAB的deep learning designer和googlenet,完成图像分类。
Using Pretrained Networks
深度学习的使用主要包括三个方面:网络结构,训练数据和优化策略。在MATLAB的deep learning designer中包含预先训练好的模型,我们可以直接使用。在Deep Learning Onramp中使用Googlenet实现图像分类。
基础语法
googlenet 的输入为2242243的三通道图像,输出为分类结果和概率(confidence)。
图片的导入与显示
img1 = imread("file01.jpg");
imshow(img1)
加载预训练模型
deepnet = googlenet
classify分类
[pred,scores] = classify(deepnet,img1)
[pred,scores] = classify(net,imds)
模型输入输出层参数
ly = deepnet.Layers
inlayer = ly(1)
outlayer = ly(end)
insz = inlayer.InputSize % 输入图像大小
categorynames = outlayer.Classes % 输出分类
图像分析
%% bar
highscores = scores > 0.01;
bar(scores(highscores))
xticklabels(categorynames(highscores))
xtickangle(60) % 横坐标旋转60°
%% bar datastore
[preds,scores] = classify(net,imds)
bar(max(scores,[],2))
xticklabels(preds)
xtickangle(60)
ylabel("Score of Prediction")
DataStore
imds = imageDatastore("*.jpg")
fname = imds.Files
img = readimage(imds,7);
preds = classify(net,imds)
%% with subfolders 将subfolders作为laber
flwrds = imageDatastore("Flowers","IncludeSubfolders",true)
flwrds = imageDatastore(pathToImages,"IncludeSubfolders",true,"LabelSource","foldernames")
图片预处理
%% img
img = imresize(img,[224 224]);
%% imds
auds = augmentedImageDatastore([224 224],imds)
auds = augmentedImageDatastore([224 224],imds,"ColorPreprocessing","gray2rgb")
分割训练集和测试集
[flwrTrain,flwrTest] = splitEachLabel(flwrds,0.6)
[flwrTrain,flwrTest] = splitEachLabel(flwrds,0.8,"randomized")
[flwrTrain,flwrTest] = splitEachLabel(flwrds,50) % 数量不同时
训练选项(Training Optional)
opts = trainingOptions("sgdm")
opts = trainingOptions("sgdm","InitialLearnRate",0.001) % 学习率
更换输入输出层
net = googlenet;
lgraph = layerGraph(net);
newFc = fullyConnectedLayer(2,"Name","new_fc")
lgraph = replaceLayer(lgraph,"loss3-classifier",newFc)
newOut = classificationLayer("Name","new_out")
lgraph = replaceLayer(lgraph,"output",newOut)
训练
[flowernet,info] = trainNetwork(trainImgs, lgraph, options);
plot(info.TrainingLoss)
实现方法
MATLAB中的googlenet包含1000种标签,可以实现常见物品图像的分类。
基本步骤
- 建立数据集:建立datastore,关联标签
- 图像预处理:转换为2242243的三通道图片,划分训练集和测试集
- 引入预训练网络进行分类
- 结果处理:使用bar或confusionchart观察结果。
Transfer Learning
在实际工程中,我们往往仅需要几种分类结果。此时,可以从0开始训练一个网络,但这种方法需要大量的数据和计算资源。一种更好的方法是在原有参数的基础上修改输出层结构,再用小样本训练微调参数,在轻量级下实现较好的效果。
实例
MATLAB教程中提供了一个例子,可以根据蠕虫图像判断死活。具体资源可去文章开头的课程链接进行下载。
imds = imageDatastore("WormImages");
groundtruth = readtable("WormData.csv");
imds.Labels = categorical(groundtruth.Status);
[trainImgs,testImgs] = splitEachLabel(imds,0.6,"randomized");
trainds = augmentedImageDatastore([224 224],trainImgs,"ColorPreprocessing","gray2rgb");
testds = augmentedImageDatastore([224 224],testImgs,"ColorPreprocessing","gray2rgb");
net = googlenet;
lgraph = layerGraph(net);
newFc = fullyConnectedLayer(2,"Name","new_fc")
lgraph = replaceLayer(lgraph,"loss3-classifier",newFc)
newOut = classificationLayer("Name","new_out")
lgraph = replaceLayer(lgraph,"output",newOut)
options = trainingOptions("sgdm","InitialLearnRate", 0.001);
wormsnet = trainNetwork(trainds,lgraph,options)
preds = classify(wormsnet,testds);
truetest = testImgs.Labels;
nnz(preds == truetest)/numel(preds)
confusionchart(truetest,preds);