Этот пример показывает, как извлечь изученные функции изображений от предварительно обученной сверточной нейронной сети и использовать те функции, чтобы обучить классификатор изображений. Выделение признаков является самым легким и самым быстрым путем использование представительная степень предварительно обученных глубоких сетей. Например, можно обучить машину вектора поддержки (SVM) с помощью fitcecoc
(Statistics and Machine Learning Toolbox™) на извлеченных функциях. Поскольку выделение признаков только требует одного прохода через данные, это - хорошая отправная точка, если у вас нет графического процессора, чтобы ускорить сетевое обучение с.
Разархивируйте и загрузите демонстрационные изображения как datastore изображений. imageDatastore
автоматически маркирует изображения на основе имен папок и хранит данные как объект ImageDatastore
. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти. Разделите данные в 70%-е обучение и 30% тестовых данных.
unzip('MerchData.zip'); imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames'); [imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');
Существует теперь 55 учебных изображений и 20 изображений валидации в этом очень небольшом наборе данных. Отобразите некоторые демонстрационные изображения.
numTrainImages = numel(imdsTrain.Labels); idx = randperm(numTrainImages,16); figure for i = 1:16 subplot(4,4,i) I = readimage(imdsTrain,idx(i)); imshow(I) end
Загрузите предварительно обученную сеть ResNet-18. Если Модель Deep Learning Toolbox для пакета Сетевой поддержки ResNet-18 не установлена, то программное обеспечение обеспечивает ссылку на загрузку. ResNet-18 обучен больше чем на миллионе изображений и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате модель изучила богатые представления функции для широкого спектра изображений.
net = resnet18
net = DAGNetwork with properties: Layers: [72x1 nnet.cnn.layer.Layer] Connections: [79x2 table]
Анализируйте сетевую архитектуру. Первый слой, изображение ввело слой, требует входных изображений размера 224 224 3, где 3 количество цветовых каналов.
inputSize = net.Layers(1).InputSize; analyzeNetwork(net)
Сеть требует входных изображений размера 224 224 3, но изображения в хранилищах данных изображений имеют различные размеры. Чтобы автоматически изменить размер обучения и тестовых изображений, прежде чем они будут введены к сети, создайте увеличенные хранилища данных изображений, задайте желаемый размер изображения и используйте эти хранилища данных в качестве входных параметров к activations
.
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain); augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);
Сеть создает иерархическое представление входных изображений. Более глубокие слои содержат высокоуровневые функции, созданное использование функций низшего уровня более ранних слоев. Чтобы получить представления функции обучения и тестовых изображений, используйте activations
на глобальный слой объединения, 'pool5',
в конце сети. Глобальные слои объединения объединяют входные функции по всем пространственным местоположениям, давая 512 функций всего.
layer = 'pool5'; featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows'); featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows'); whos featuresTrain
Name Size Bytes Class Attributes featuresTrain 55x512 112640 single
Извлеките метки класса от обучения и тестовых данных.
YTrain = imdsTrain.Labels; YTest = imdsTest.Labels;
Используйте функции, извлеченные от учебных изображений как переменные прогноза, и соответствуйте машине вектора поддержки (SVM) мультикласса с помощью fitcecoc
(Statistics and Machine Learning Toolbox).
classifier = fitcecoc(featuresTrain,YTrain);
Классифицируйте тестовые изображения с помощью обученной модели SVM, использующей функции, извлеченные от тестовых изображений.
YPred = predict(classifier,featuresTest);
Отобразите четыре демонстрационных тестовых изображения с их предсказанными метками.
idx = [1 5 10 15]; figure for i = 1:numel(idx) subplot(2,2,i) I = readimage(imdsTest,idx(i)); label = YPred(idx(i)); imshow(I) title(char(label)) end
Вычислите точность классификации на набор тестов. Точность является частью меток, которые сеть предсказывает правильно.
accuracy = mean(YPred == YTest)
accuracy = 1
Можно также извлечь функции от более раннего слоя в сети и обучить классификатор на тех функциях. Более ранние слои обычно извлекают меньше, более мелкие функции, имеют более высокое пространственное разрешение и большее общее количество активаций. Извлеките функции от слоя 'res3b_relu'
. Это - последний слой, из которого выходные параметры 128 функций и активации имеют пространственный размер 28 28.
layer = 'res3b_relu'; featuresTrain = activations(net,augimdsTrain,layer); featuresTest = activations(net,augimdsTest,layer); whos featuresTrain
Name Size Bytes Class Attributes featuresTrain 28x28x128x55 22077440 single
Извлеченные функции, использованные в первой части этого примера, были объединены по всем пространственным местоположениям глобальным слоем объединения. Чтобы достигнуть того же результата при извлечении функций в более ранних слоях, вручную насчитайте активации по всем пространственным местоположениям. Чтобы получить функции на форме N
-by-
, C
, где N является количеством наблюдений и C, является количеством функций, удалите одноэлементные размерности и транспонируйте.
featuresTrain = squeeze(mean(featuresTrain,[1 2]))';
featuresTest = squeeze(mean(featuresTest,[1 2]))';
whos featuresTrain
Name Size Bytes Class Attributes featuresTrain 55x128 28160 single
Обучите классификатор SVM на более мелких функциях. Вычислите тестовую точность.
classifier = fitcecoc(featuresTrain,YTrain); YPred = predict(classifier,featuresTest); accuracy = mean(YPred == YTest)
accuracy = 0.9500
Оба обучались, SVMs имеют высокую точность. Если точность высоко достаточно не использует выделение признаков, то попробуйте передачу, учащуюся вместо этого. Для примера смотрите Нейронную сеть для глубокого обучения Train, чтобы Классифицировать Новые Изображения. Для списка и сравнения предварительно обученных сетей, смотрите Предварительно обученные Глубокие нейронные сети.