Этот пример показывает, как извлечь признаки выученного изображения из предварительно обученной сверточной нейронной сети и использовать эти функции для обучения классификатора изображений. Редукция данных является самым простым и быстрым способом использования репрезентативной степени предварительно обученных глубоких сетей. Для примера можно обучить машину опорных векторов (SVM), используя fitcecoc
(Statistics and Machine Learning Toolbox™) на извлеченных функциях. Поскольку редукция данных требуется только один проход через данные, это хорошая начальная точка, если у вас нет графический процессор, чтобы ускорить обучение сети с.
Разархивируйте и загружайте образцы изображений как image datastore. imageDatastore
автоматически помечает изображения на основе имен папок и сохраняет данные как ImageDatastore
объект. image 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 Model для ResNet-18 Network поддержки не установлен, то программное обеспечение предоставляет ссылку загрузки. ResNet-18 обучается на более чем миллионе изображений и может классифицировать изображения в 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате модель получила богатые представления функций для широкой области значений изображений.
net = resnet18
net = DAGNetwork with properties: Layers: [71x1 nnet.cnn.layer.Layer] Connections: [78x2 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
Оба обученных SVM имеют высокую точность. Если точность недостаточно высока с помощью редукции данных, попробуйте перенести обучение вместо этого. Для получения примера смотрите Train Нейронной сети для глубокого обучения для классификации новых изображений. Список и сравнение предварительно обученных сетей смотрите в Pretrained Deep Neural Networks.
resnet50
| fitcecoc
(Statistics and Machine Learning Toolbox)