这个例子展示了如何从预先训练的卷积神经网络中提取学习到的图像特征,并使用这些特征来训练图像分类器。特征提取是利用预先训练的深度网络的表征能力的最简单和最快的方法。例如,您可以使用以下方法训练支持向量机(SVM)金宝appfitcecoc
(Statistics and Machine Learning Toolbox™)。因为特征提取只需要对数据进行一次遍历,所以如果你没有GPU来加速网络训练,这是一个很好的起点。
将示例图像解压并作为图像数据存储加载。imageDatastore
自动标签的图像基于文件夹名称和存储数据作为ImageDatastore
对象。图像数据存储允许存储大的图像数据,包括内存中不合适的数据。将数据分成70%的训练数据和30%的测试数据。
解压缩(“MerchData.zip”);imd = imageDatastore (“MerchData”,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);[imdsTrain, imdsTest] = splitEachLabel (imd, 0.7,“随机”);
现在在这个很小的数据集中有55张训练图像和20张验证图像。显示一些示例图像。
numTrainImages =元素个数(imdsTrain.Labels);idx = randperm (numTrainImages 16);数字为i = 1:16 subplot(4,4,i) i = readimage(imdsTrain,idx(i));imshow(我)结束
加载预训练的ResNet-18网络。如果是深度学习工具箱模型ResNet-18网络金宝app支持包未安装,则软件提供下载链接。ResNet-18可以训练超过100万幅图像,并可以将图像分为1000个对象类别,如键盘、鼠标、铅笔和许多动物。因此,该模型学习了丰富的特征表示范围广泛的图像。
网= resnet18
net = DAGNetwork with properties: Layers: [71x1 net.cnn.layer. layer] Connections: [78x2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}
分析网络架构。第一层,图像输入层,要求输入尺寸为224 × 224 × 3的图像,其中3是彩色通道的数量。
inputSize = net.Layers (1) .InputSize;analyzeNetwork(净)
网络需要大小为224 × 224 × 3的输入图像,但是图像数据存储中的图像大小不同。要在将训练和测试图像输入到网络之前自动调整其大小,请创建扩展的图像数据存储,指定所需的图像大小,并使用这些数据存储作为输入参数激活
.
augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain);augimdsTest = augmentedImageDatastore (inputSize (1:2), imdsTest);
该网络构建了输入图像的层次表示。较深的层包含使用较早层的较低层次特性构造的较高层次特性。要获得训练和测试图像的特征表示,使用激活
在全局池化层,“pool5”,
在网络的末端。全局池化层将所有空间位置的输入特征汇集在一起,总共提供512个特征。
层=“pool5”;featuresTrain =激活(净、augimdsTrain层,“OutputAs”,“行”);featuresTest =激活(净、augimdsTest层,“OutputAs”,“行”);谁featuresTrain
名称大小字节类属性特性55x512 112640单
从训练和测试数据中提取类标签。
YTrain = imdsTrain.Labels;欧美= imdsTest.Labels;
利用从训练图像中提取的特征作为预测变量,拟合出多类支持向量机金宝appfitcecoc
统计学和机器学习工具箱。
分类器= fitcecoc (featuresTrain YTrain);
利用从测试图像中提取的特征,使用训练过的支持向量机模型对测试图像进行分类。
YPred =预测(分类器,featuresTest);
显示四个样本测试图像与他们的预测标签。
Idx = [1 5 10 15];数字为i = 1:numel(idx) subplot(2,2,i) i = readimage(imdsTest,idx(i));标签= YPred (idx (i));imshow (I)标题(char(标签)结束
计算测试集上的分类精度。准确率是网络正确预测标签的比例。
精度=平均值(YPred == YTest)
精度= 1
您还可以从网络中较早的一层提取特征,并根据这些特征训练分类器。较早的层通常提取较少、较浅的特征,具有较高的空间分辨率,激活总数较大。提取特征“res3b_relu”
层。这是最后一层,输出128个特征,激活的空间大小为28乘28。
层=“res3b_relu”;featuresTrain =激活(净、augimdsTrain层);featuresTest =激活(净、augimdsTest层);谁featuresTrain
Name Size Bytes Class Attributes feature
本例第一部分中使用的提取特征由全局池化层在所有空间位置上池化。为了在较早的层中提取特征时获得相同的结果,手动对所有空间位置上的激活进行平均。来获取表单上的特征N
——- - - - - -
C
,在那里N观察的次数是多少C为特征个数,去掉单维并进行转置。
featuresTrain = squeeze(mean(featuresTrain,[1 2]))';featuresTest = squeeze(mean(featuresTest,[1 2]))';谁featuresTrain
名称大小字节类属性特征55x128 28160单
在较浅的特征上训练SVM分类器。计算测试精度。
分类器= fitcecoc (featuresTrain YTrain);YPred =预测(分类器,featuresTest);精度=平均值(YPred == YTest)
精度= 0.9500
两种训练的支持向量机都具有较高的精度。如果使用特征提取的准确率不够高,那么可以尝试迁移学习。例如,请参见训练深度学习网络对新图像进行分类.有关预先训练的网络的列表和比较,请参见预先训练的深度神经网络.
fitcecoc
(统计学和机器学习工具箱)|resnet50