MATLAB2018a深度学习笔记一(CNN)(参考价值不大只有我自己能看懂)

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)

你可能感兴趣的:(MATLAB2018a深度学习笔记一(CNN)(参考价值不大只有我自己能看懂))