В этом примере показано, как извлечь изученные функции изображений из предварительно обученной сверточной нейронной сети и использовать те функции, чтобы обучить классификатор изображений. Извлечение признаков является самым легким и самым быстрым способом использовать представительную степень предварительно обученных глубоких сетей. Например, можно обучить машину опорных векторов (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: [71×1 nnet.cnn.layer.Layer] Connections: [78×2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}
Анализируйте сетевую архитектуру. Первый слой, изображение ввело слой, требует входных изображений размера 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 имеют высокую точность. Если точность высоко достаточно не использует извлечение признаков, то попробуйте передачу обучения вместо этого. Для примера смотрите, Обучают Нейронную сеть для глубокого обучения Классифицировать Новые Изображения. Для списка и сравнения предварительно обученных сетей, смотрите Предварительно обученные Глубокие нейронные сети.