目录
3.1.1 使用imageDatastore创建数据存储(DataStore)
3.3.2 使用增强的图像数据存储(DataStore)进行颜色预处理
4.4.1 使用fullyConnectedLayer函数创建一个新的全连接层
4.5.1 使用trainingOptions来查看所选训练算法的可用选项(一定要查看帮助手册)
1. 简介
该课程为MATLAB官网免费课程,此笔记只对该课程进行一定的翻译和记录,方便日后复习。官网链接为https://ww2.mathworks.cn/learn/tutorials/deep-learning-onramp.html(深度学习入门之旅)。
2. 使用预训练网络:使用已创建和训练后的网络进行分类
2.1 课程示例-识别一些图像中的对象
在本节课程中,您将学习如何使用预先构建的深度神经网络对下面 12 个图像的内容进行分类。理想的分类应为 'beach'、'cat'、'cupcakes'、'lake'、'fish' 等。
在此交互练习中,您会将部分图像文件导入到 MATLAB 中并查看它们。
2.1.1 导入图像
将文件 file01.jpg
中的图像导入 MATLAB 工作区中。将其存储在名为 img1
的变量中。
I = imread('filename.png')
2.1.2 显示导入的图像。
imshow(I)
2.1.3 存储图像
前两项任务将导入并显示 file01.jpg
中的图像。在脚本中添加命令,以导入并显示 file02.jpg
和 file03.jpg
文件中的图像。将图像分别存储在名为 img2
和 img3
的变量中。
img2 = imread('file02.jpg');
imshow(img2)
img3 = imread('file03.jpg');
imshow(img3)
2.2 执行预测
2.2.1 创建预定义的深度网络“AlexNet”的副本
使用 alexnet
函数加载一个预训练网络。将结果保存为一个名为 deepnet
的变量。
deepnet = alexnet % 这里的网络模型使用Alexnet;可以通过matlab官方下载Alexnet安装包,安装后可用(APP----安装APP)
2.2.2 分类预测
用 classify
函数和预训练的 AlexNet 网络来预测变量 img1
中存储的图像的主题类别。将网络的预测存储在名为 pred1
的变量中。 pred1 = classify(deepnet,img1)
也可用 [pred, score] = classify(net,img) % 将网络和输入图像传入分类函数,将得到输入图像的类别preds以及它在每一类中的预测分数score
2.2.3 img2和3的分类预测
在脚本中添加命令,对变量 img2
和 img3
中存储的图像的内容进行预测。将预测的类分别存储在名为 pred2
和 pred3
的变量中。
pred2 = classify(deepnet,img2)
pred3 = classify(deepnet,img3)
2.2.4 获取预训练网络
2.3 CNN架构 查看网络层
MATLAB将CNN表示为一个层的数组,数组的第一个元素为输入层,最后一个元素为输出层。
2.3.1 查看网络的层
将 deepnet
的 Layers
属性提取到名为 ly
的变量中。
ly = deepnet.Layers % 由下图可以看出Alexnet是一个具有25层的数组
2.3.2 索引查看单个层
将网络的第一层(输入层)提取到名为 inlayer
的变量中。
inlayer = ly(1)
2.3.3 提取某一层的某种属性
提取网络第一层的 InputSize
属性(存储在变量 inlayer
中)。将结果存储在名为 insz
的变量中。
insz = inlayer.InputSize % 输入层的输入图像大小
2.3.4 图像维度
输入图像是彩色图像,尺寸为:227×227×3。灰度图像的尺寸为227×227。
将网络的最后一层(输出层)提取到名为 outlayer
的变量中。
outlayer = ly(end)
2.3.5 提取输出层的类属性
提取网络最后一层的 Classes
属性(存储在变量 outlayer
中)。将结果存储在名为 categorynames
的变量中。
categorynames = outlayer.Classes % 得到一个列向量,表示Alexnet的1000个类的名字
2.4 研究预测
2.4.1 预测分数
使用 classify
函数和预训练的 AlexNet 网络 net
来预测变量 img
中存储的图像的主题类别。将网络的预测存储在名为 pred
的变量中,并将所有预测分数存储在名为 scores
的变量中。上面的分类函数classify只是将输入图像预测为某一类,并不知道输入图像是该类的概率。该任务不仅会得到预测分类,还会得出预测分数。
前期输入:
img = imread('file01.jpg');
imshow(img)
net = alexnet;
categorynames = net.Layers(end).ClassNames;
分数预测:
[pred,scores] = classify(net,img) % 得到的分数是一个行向量,表示1000个类的预测分数
2.4.2 创建预测分类的条形图
创建预测分数的条形图。
bar(scores)%因为有 1000 个预测分数,所创建的条形图会难以阅读。
2.4.3 挑出主要分数
创建一个逻辑数组 highscores
,其中的值 1 (true
) 对应于 scores
大于 0.01
的情况。
highscores = (scores > 0.01) 或者 highscores = scores > 0.01 % 将scrs数组中大于0.01的元素赋为1,其他为0
2.4.4 显示挑选预测分数后的条形图
使用逻辑索引创建高于阈值 0.01
的预测值的条形图。
bar(scores(highscores)) %scores(highscores)返回大于0.01的类别的预测分数
2.4.5 为x轴增加类别标签
使用逻辑索引和 xticklabels
函数为条形图添加对应的预测类名标签。类名的完整列表存储在变量 categorynames
中。
xticklabels(categorynames(highscores)) % categorynames(highscores) 返回大于0.01的类别的名字
3 管理数据集:使用已创建和训练后的网络执行分类
3.1 图像数据存储
ls *.jpg
net = alexnet;
3.1.1 使用imageDatastore创建数据存储(DataStore)
创建一个名为 imds
的数据存储,该数据存储引用当前文件夹中文件名从 file01.jpg
到 file12.jpg
的图像文件。(请注意,在此文件夹中,只有这些图像文件的名称为 filenn.jpg
形式。)
imds = imageDatastore('*.jpg') % 使用通配符*指定多个文件。
3.1.2 数据存储的属性包含有关数据文件的元信息
使用数据存储 imds
的 Files
属性提取图像的文件名。将结果存储在名为 fname
的变量中。
fname = imds.Files