download ALEXnet
deepnet=alexnet
classify image
pred=classify(deepnet,img)
Save layers
ly=deepnet.layers
Extract fist layer
inlayer=ly(1)
Extract input size
insz=inlayer.InputSize
Extract last layer
outlayer=ly(end)
Extract class names
categorynames=outlayer.ClassNames
Classify an image
[pred,scores]=classify(net,img)
Store the network's prediction in a variable called pred and all the prediction scores in a variable called scores.
Display scores
bar(scores)
Threshold scores
highscores=scores>0.01
Display thresholded scores
bar(scores(highscores))
Add tick labels
xticklabels(categorynames(highscores))
还可以设置动态阈值,阈值在中值之上
thresh = median(scores) + std(scores);
highscores = scores > thresh;
另外还可以这样设置横坐标的标名
xticks(1:length(scores(highscores)))
xticklabels(categorynames(highscores))
xtickangle(60)
这段代码显示当前文件夹中的图像,并导入AlexNet。
ls *.jpg
net = alexnet;
创建一个数据存储库
imds=imageDatastore('file*.jpg')
提取文件名
fname=imds.Files
读一个图像
img=readimage(imds,7)
Info: You can manually import data from a datastore using the read, readimage, and readall functions - read imports images one at a time, in order; readimage imports a single specific image; readall imports all the images into a single cell array (with each image in a separate cell).This imports the nth image of the datastore ds into an array called I
I = readimage(ds,n)
分类图像
preds=classify(net,imds)
Info:默认情况下,imageDatastore在给定的文件夹中寻找图像文件。你可以使用“IncludeSubfolders”选项在给定文件夹的子文件夹中查找图像。
ds = imageDatastore(“folder”,“IncludeSubfolders”,true)
如
flwrds=imageDatastore('Flowers','IncludeSubfolders',true)
tranfer learning
1、Network layers
2、training data;
3、algorithm options
准备训练数据
训练所需的标签可以存储在标签中。默认情况下,标签属性是空的。你可以通过指定“LabelSource”选项来自动确定文件夹名称中的标签。
ds = imageDatastore(folder,'IncludeSubfolders',true,'LabelSource','foldernames')
创建数据存储与标签
load pathToImages
flwrds=imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource','foldernames');
提取新的标签
将flwrds的标签属性提取到一个名为花名的变量中。
flowernames=flwrds.Labels;
分离标签,一部分用来做测试,一部分用来训练,按一定比列顺序分离:
您可以使用splitEachLable函数将数据存储中的图像分割成两个独立的数据存储。[ds1,ds2] = splitEachLabel(imds,p)p(从0到1的值)表示来自imds的每个标签的图像的比例应该包含在ds1中。其余的文件被分配给ds2。
分离标签,随机分离:
[ds1,ds2] = splitEachLabel(imds,p,'randomized')
按图像数量分割数据存储:
当p是0到1的值时,它被解释为一个比例。然后将图像分割,以便每个标签按比例分割。您还可以指定从每个标签中获取的文件的确切数量,以便分配给ds1。
修改网络层
创建一个新的网络层
fullyConnectedLayer函数创建一个全新的完全连通的层,具有给定数量的神经元。
fclayer = fullyConnectedLayer(n)
取代23层
您可以使用标准的数组索引来修改一组层的各个元素。mylayers(n) = mynewlayer
如layers(23)=fc
取代最后一层(输出层)
您可以使用分类层函数来为图像分类网络创建一个新的输出层。cl = classificationLayer
您可以创建新的层,并在单个命令中覆盖新层:mylayers(n) = classificationLayer
设置训练选项
设置默认选项
你可以为训练算法设置什么选项?您可以通过使用trainingOptions函数来查看可用的选项。opts = trainingOptions('sgdm')这就创建了一个变量选择,其中包含了训练算法的默认选项,“带动量的随机梯度下降”。
另外
改变了学习速率
通常,您首先希望尝试使用默认值保留的大多数选项进行培训。然而,在执行转移学习时,您通常希望从InitialLearnRate集开始到比默认的01.01更小的值。
学习速率控制算法改变网络权重的力度。转移学习的目标是对现有的网络进行微调,所以你通常想要比从头开始训练时更少地改变权重。
设置初始的学习速率
你可以在trainingOptions函数中指定任意数量的设置为可选的名称-值对。opts = trainingOptions('sgdm','Name',value)
在每次迭代中,训练图像的一个子集,称为迷你批,用于更新权重。每次迭代使用不同的迷你批处理。一旦整个训练集被使用,那就是所谓的“新纪元”。
GPU(图形处理单元)可以显著加快深度学习所需的许多计算。如果计算机没有GPU,训练可以在CPU上执行,但可能需要很长时间。如果你想认真学习深度学习,你会想要在一台能处理处理的GPU上训练你的网络。
如果你安装了合适的GPU和并行计算工具箱,trainNetwork功能将自动执行GPU上的训练——不需要特殊的编码。
如果没有,培训将会在你的电脑的CPU上完成。这使您可以在承诺购买所需的硬件和软件之前进行一些试验。
训练后的网络评估
画出训练后的损失
变量信息是一个包含训练信息的结构。在每个迭代中,字段的训练损失和训练精度包含了网络在训练数据上的性能记录。
load pathToImages
load
trainedFlowerNetwork flowernet info
plot(info.TrainingLoss)
图像分类
dsflowers = imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource','foldernames');
[trainImgs,testImgs] = splitEachLabel(dsflowers,0.98);
调查测试性能
通过比较预测的分类和已知的分类,您可以确定网络正确分类的测试图像有多少。已知的分类存储在数据存储器的标签属性中。
提取标签
load pathToImages.mat
pathToImages
flwrds = imageDatastore(pathToImages,'IncludeSubfolders',true,'LabelSource','foldernames');
[trainImgs,testImgs] = splitEachLabel(flwrds,0.98);
load trainedFlowerNetwork flwrPreds
数正确量
您可以使用逻辑比较和nnz函数来确定匹配的两个数组的元素数量:
numequal = nnz(a == b)
计算正确率
fracCorrect=numCorrect/numel(flwrPreds)
性能的类
损失和准确性提供了网络性能的总体度量。但是,研究网络在不同的图像类上的表现是可以提供信息的。错误分类是随机分布的还是有特定的类对网络来说是困难的?是否有网络不成比例地混淆了?
计算混淆矩阵
confusionmat函数计算了预测分类的混乱矩阵。cmat = confusionmat(knownclass,predictedclass)混乱矩阵cmat的(j k)元素是一个计数,它包含了在k类中预测的类j的多少图像,因此,对角元素表示正确的分类;非对角元素代表误分类。
用类标签计算混乱矩阵
为了解释混淆矩阵,它有助于列出类标签的列表。你可以从confusionmat中获得标签作为第二个输出。[flwrconf,flwrnames]=confusionmat(testImgs.Labels,flwrPreds)
可视化混淆矩阵
您可以使用heatmap函数将混淆矩阵可视化为“热图”。
热图(包含ylabels矩阵)
对于一个混乱矩阵,x和y标签是相同的(类名)。如
heatmap(flwrnames,flwrnames,flwrconf)
预处理图像
裁剪图像
您可以使用imcrop函数来提取图像的一部分。
imgcrop = imcrop(img,[horiz vert w h]);这就提取了宽w和高h的图像,离左上角水平方向vert个像素,垂直方向horiz个像素
如
img = imread('wormA01.tif');
img=imcrop(img,[130 80 426 426])
调整图像大小
您可以使用imresize的函数来调整图像的大小。
imgresz = imresize(img,[numrows numcols]);
这就使img的大小调整为每一个numcols*numcols。也就是说,imgresz有一个numcols像素的宽度和一个numrows像素的高度。
将灰度图转换成彩色
您可以使用repmat函数多次复制一个数组。
y = repmat(x,[1 1 3]);
它在第一个维度复制了数组x,第二个维度中复制一次,在第三维中重复了三次。如果x是一个表示灰度图像的矩阵,那么y将是一个表示颜色(RGB)图像的3-D数组。
使用自定义导入功能的预处理图像
自己写一个function函数
创建数据存储
你可以使用图像数据存储的ReadFcn属性来指定当图像被读入内存时使用的自定义导入函数。使用@符号来定义一个函数句柄到导入函数。ds = imageDatastore(location,'ReadFcn',@myfun)
这将使用myfun作为导入功能,在location创建一个数据存储。
读入图像
img=read(wormds)