此示例显示了如何从验证的卷积神经网络中提取学习的图像特征,并使用这些功能来训练图像分类器。特征提取是使用预验证的深网的代表力的最简单,最快的方法。例如,您可以使用支持向量机(SVM)使用金宝appfitcecoc
(统计和机器学习工具箱™)在提取的功能上。由于功能提取仅需要通过数据,因此如果您没有GPU可以加速网络培训,则是一个很好的起点。
解压缩并加载样品图像作为图像数据存储。成像
自动根据文件夹名称标记图像,并将数据存储为一个成像
目的。图像数据存储使您可以存储大型图像数据,包括不适合内存的数据。将数据分为70%的培训和30%的测试数据。
解压缩('merchdata.zip');imds = imagedatastore('merchdata',,,,“包括橡皮folders”,真的,“ Labelsource”,,,,“折叠式”);[imdstrain,imdstest] = spliteachlabel(imds,0.7,“随机”);
现在,在这个很小的数据集中,现在有55张培训图像和20个验证图像。显示一些示例图像。
numTrainImages = numel(imdstrain.labels);idx = randperm(numTrainimages,16);数字为了i = 1:16子图(4,4,i)i = deadImage(imdstrain,idx(i));imshow(i)结尾
加载预处理的RESNET-18网络。如果深度学习工具箱模型用于RESNET-18网络金宝app支持软件包未安装,然后该软件提供了下载链接。RESNET-18经过一百万张图像的培训,可以将图像分类为1000个对象类别,例如键盘,鼠标,铅笔和许多动物。结果,该模型已经学习了广泛图像的丰富特征表示。
net = resnet18
net =带有属性的dagnetwork:layers:[71x1 nnet.cnn.layer.layer] connections:[78x2 table] inputNames:{'data'} outputnames:{'classification layer_predictions'}
分析网络体系结构。第一层是图像输入层,需要大小224 by-224 by-3的输入图像,其中3是颜色通道的数量。
inputsize = net.layers(1).inputsize;分析(NET)
该网络需要大小224-BY-224-BY-3的输入图像,但是图像数据存储中的图像具有不同的尺寸。要在输入网络之前自动调整培训和测试图像,创建增强图像数据存储,指定所需的图像大小,然后将这些数据存储用作输入参数激活
。
AugimdStrain = augmentedimagedatastore(inputsize(1:2),imdstrain);augimdstest = augmentedimagedatastore(inputsize(1:2),imdstest);
该网络构建输入图像的层次表示。更深的层包含更高级别的特征,该特征是使用早期层的低级特征构建的。要获取培训和测试图像的功能表示形式,请使用激活
在全球合并层上,'pool5',
在网络结束时。全局池层汇集了所有空间位置上输入功能,总共提供了512个功能。
layer ='pool5';featurestrain =激活(net,augimdstrain,层,,'outputas',,,,“行”);farmateStest =激活(net,augimdstest,layer,layer,'outputas',,,,“行”);谁是特征
名称大小字节类属性特征术55x512 112640单
从培训和测试数据中提取类标签。
ytrain = imdstrain.labels;ytest = imdstest.labels;
使用从训练图像中提取的功能作为预测变量,并使用多类支持向量机(SVM)使用金宝appfitcecoc
(统计和机器学习工具箱)。
classifier = fitcecoc(featurantain,ytrain);
使用训练有素的SVM模型使用从测试图像中提取的功能对测试图像进行分类。
ypred =预测(分类器,特征最佳);
显示四个带有预测标签的样本测试图像。
IDX = [1 5 10 15];数字为了i = 1:numel(idx)子图(2,2,i)i = deadImage(imdstest,idx(i));label = ypred(idx(i));imshow(i)标题(char(label))结尾
计算测试集上的分类精度。精度是网络正确预测的标签的比例。
精度=平均值(ypred == ytest)
精度= 1
您还可以从网络中的较早层中提取功能,并在这些功能上训练分类器。较早的层通常提取更少的,较浅的特征,具有较高的空间分辨率和较大的激活总数。从'res3b_relu'
层。这是输出128个功能的最后一层,并且激活的空间大小为28 x-28。
layer ='res3b_relu';特征仪=激活(net,augimdstrain,层);farmatureSteSt =激活(Net,Augimdstest,layer layer);谁是特征
名称大小字节类属性featurantain 28x28x128x55 22077440单
本示例第一部分中使用的提取功能通过全局池层在所有空间位置汇总。为了在早期层中提取特征时达到相同的结果,请在所有空间位置手动平均激活。要在表单上获取功能n
-经过-
C
, 在哪里n是观察的数量和C是功能的数量,删除单例维度和转置。
featurestrain = squeeze(均值(特征术,[1 2]))';temurestest = squeeze(均值(featurestest,[1 2]))';谁是特征
名称大小字节类属性特征术55x128 28160单
在较浅的功能上训练SVM分类器。计算测试精度。
classifier = fitcecoc(featurantain,ytrain);ypred =预测(分类器,特征最佳);精度=平均值(ypred == ytest)
精度= 0.9500
两种训练有素的SVM都有很高的精度。如果使用功能提取的精度不够高,请尝试转移学习。例如,请参阅训练深度学习网络以对新图像进行分类。有关验证网络的列表和比较,请参见预处理的深神经网络。