exponenta event banner

squeezenet

Сверточная нейронная сеть SqueeeNet

Описание

SqueeeNet - сверточная нейронная сеть глубиной 18 слоев. Предварительно подготовленную версию сети можно загрузить на более чем миллион изображений из базы данных ImageNet [1]. Предварительно обученная сеть может классифицировать изображения на 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате сеть получила богатые представления элементов для широкого спектра изображений. Эта функция возвращает сеть SqueeEcNet версии 1.1, которая имеет точность, аналогичную точности SqueeeNet версии 1.0, но требует меньше операций с плавающей запятой на предсказание [3]. Сеть имеет размер входного изображения 227 на 227. Дополнительные сведения о предварительно подготовленных сетях в MATLAB ® см. в разделе Предварительно обученные глубокие нейронные сети.

Вы можете использовать classify для классификации новых изображений с использованием сети SqueeeNet. Пример см. в разделе Классификация изображения с помощью SqueeEcNet.

Сеть SqueeEcNet можно переподготовить для выполнения новой задачи с помощью обучения передаче. Пример см. в разделе Интерактивное обучение передаче данных с помощью SqueeEcNet.

пример

net = squeezenet возвращает сеть SqueeEcNet, обученную набору данных ImageNet.

net = squeezenet('Weights','imagenet') возвращает сеть SqueeEcNet, обученную набору данных ImageNet. Этот синтаксис эквивалентен net = squeezenet.

lgraph = squeezenet('Weights','none') возвращает необученную сетевую архитектуру SqueeEcNet.

Примеры

свернуть все

Загрузите предварительно обученную сеть SqueeEcNet.

net = squeezenet
net = 

  DAGNetwork with properties:

         Layers: [68×1 nnet.cnn.layer.Layer]
    Connections: [75×2 table]

Эта функция возвращает DAGNetwork объект.

SqueeExNet входит в состав Deep Learning Toolbox™. Для загрузки других сетей используйте такие функции, как googlenet для получения ссылок для загрузки предварительно подготовленных сетей из проводника надстроек.

В этом примере показано, как точно настроить предварительно обученную сеть SqueeEcNet для классификации новой коллекции изображений. Этот процесс называется transfer learning и обычно намного быстрее и проще, чем обучение новой сети, потому что вы можете применить усвоенные функции к новой задаче, используя меньшее количество обучающих образов. Чтобы подготовить сеть для интерактивного обучения передаче, используйте Deep Network Designer.

Извлечь данные

В рабочей области извлеките набор данных MathWorks Merch. Это небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежащих пяти различным классам (колпачок, куб, игральные карты, отвертка и факел).

unzip("MerchData.zip");

Открыть SqueeENet в конструкторе глубоких сетей

Откройте Deep Network Designer с помощью SqueeNet.

deepNetworkDesigner(squeezenet);

Deep Network Designer отображает увеличенное представление всей сети на панели Конструктор.

Изучите график сети. Чтобы увеличить изображение с помощью мыши, используйте клавиши Ctrl + колесо прокрутки. Для панорамирования используйте клавиши со стрелками или удерживайте колесо прокрутки и перетащите мышь. Выберите слой для просмотра его свойств. Отмените выбор всех слоев для просмотра сводки сети на панели «Свойства».

Импорт данных

Чтобы загрузить данные в Deep Network Designer, на вкладке Данные щелкните Импорт данных > Импорт данных изображения. Откроется диалоговое окно Импорт данных изображения (Import Image Data).

В списке Источник данных выберите Папка. Нажмите кнопку Обзор и выберите извлеченную папку MerchData.

Разделите данные на 70% данных обучения и 30% данных проверки.

Укажите операции увеличения, выполняемые с обучающими изображениями. В этом примере применяется случайное отражение по оси X, случайное вращение из диапазона [-90, 90] градусов и случайное масштабирование из диапазона [1,2]. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.

Нажмите кнопку Импорт, чтобы импортировать данные в Deep Network Designer.

Визуализация данных

С помощью Deep Network Designer можно визуально проверить распределение данных обучения и проверки на закладке Данные. Можно также просматривать случайные наблюдения и их метки как простую проверку перед обучением. В этом примере в наборе данных имеется пять классов.

Изменить сеть для трансферного обучения

Сверточные уровни сетевого извлеченного изображения отличаются тем, что последний обучаемый уровень и конечный уровень классификации используют для классификации входного изображения. Эти два слоя, 'conv10' и 'ClassificationLayer_predictions' в SqueeEnet, содержат информацию о том, как объединить функции, извлекаемые сетью, в вероятностях классов, значении потерь и прогнозируемых метках. Для переподготовки заранее обученной сети для классификации новых изображений замените эти два слоя новыми слоями, адаптированными к новому набору данных.

В большинстве сетей последний уровень с обучаемыми весами является полностью подключенным. В некоторых сетях, таких как SqueeEcnet, последний обучаемый уровень является окончательным сверточным уровнем. В этом случае замените сверточный слой новым сверточным слоем с количеством фильтров, равным числу классов.

На панели «Конструктор» перетащите новый convolution2dLayer на холст. Для соответствия исходному сверточному слою установите FilterSize кому 1,1. Изменение NumFilters к числу классов в новых данных, в этом примере: 5.

Изменение скорости обучения таким образом, чтобы обучение происходило быстрее в новом слое, чем в перенесенных слоях, путем установки WeightLearnRateFactor и BiasLearnRateFactor кому 10. Удалите последний сверточный слой 2-D и подключите новый слой.

Замените выходной слой. Прокрутка до конца библиотеки слоев и перетаскивание нового classificationLayer на холст. Удалите исходный выходной слой и подключите новый.

Проверить сеть

Чтобы убедиться, что отредактированная сеть готова к обучению, щелкните Анализ и убедитесь, что анализатор сети Deep Learning сообщает об отсутствии ошибок.

Железнодорожная сеть

Укажите параметры обучения. Перейдите на вкладку Обучение и щелкните Параметры обучения.

  • Установите для начальной скорости обучения небольшое значение, чтобы замедлить обучение в перенесенных слоях.

  • Укажите частоту проверки, чтобы точность данных проверки вычислялась один раз в каждую эпоху.

  • Укажите небольшое число эпох. Эпоха - это полный цикл обучения по всему набору данных обучения. Для трансферного обучения не нужно тренироваться на столько же эпох.

  • Укажите размер мини-пакета, то есть количество изображений, используемых в каждой итерации. Для обеспечения использования всего набора данных в течение каждой эпохи установите размер мини-партии, чтобы равномерно разделить количество обучающих образцов.

В этом примере задайте InitiveLearnRate равным 0.0001, ValidationFrequency to 5и MaxEpochs to 8. Поскольку существует 55 наблюдений, установите MiniBatchSize в значение 11.

Чтобы обучить сеть с указанными параметрами обучения, нажмите кнопку Закрыть, а затем нажмите кнопку Обучить.

Deep Network Designer позволяет визуализировать и контролировать ход обучения. Затем можно отредактировать варианты обучения и при необходимости переобучить сеть.

Экспорт результатов и создание кода MATLAB

Чтобы экспортировать сетевую архитектуру с обученными весами, на вкладке Обучение выберите Экспорт > Экспорт обученных сетей и результатов. Deep Network Designer экспортирует обученную сеть в качестве переменной trainedNetwork_1 и информация об обучении в качестве переменной trainInfoStruct_1.

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [1×40 double]
           TrainingAccuracy: [1×40 double]
             ValidationLoss: [3.3420 NaN NaN NaN 2.1187 NaN NaN NaN NaN 1.4291 NaN NaN NaN NaN 0.8527 NaN NaN NaN NaN 0.5849 NaN NaN NaN NaN 0.4678 NaN NaN NaN NaN 0.3967 NaN NaN NaN NaN 0.3875 NaN NaN NaN NaN 0.3749]
         ValidationAccuracy: [20 NaN NaN NaN 30 NaN NaN NaN NaN 55.0000 NaN NaN NaN NaN 65 NaN NaN NaN NaN 85 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95]
              BaseLearnRate: [1×40 double]
        FinalValidationLoss: 0.3749
    FinalValidationAccuracy: 95

Также можно создать код MATLAB, который воссоздает сеть и используемые параметры обучения. На вкладке Обучение выберите Экспорт > Создать код для обучения. Изучите код MATLAB, чтобы узнать, как программно подготовить данные для обучения, создать архитектуру сети и обучить сеть.

Классифицировать новое изображение

Загрузите новый образ для классификации с использованием обученной сети.

I = imread("MerchDataTest.jpg");

Deep Network Designer изменяет размер изображений во время обучения в соответствии с размером сетевого ввода. Чтобы просмотреть размер сетевого ввода, перейдите на панель Конструктор и выберите imageInputLayer (первый слой). Эта сеть имеет входной размер 227 на 227.

Измените размер тестового образа в соответствии с размером сетевого входа.

I = imresize(I, [227 227]);

Классифицируйте тестовый образ с помощью обучаемой сети.

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

В этом примере показано, как точно настроить предварительно обученную сверточную нейронную сеть SqueeEz Net для выполнения классификации на новой коллекции изображений.

SqueeeNet был обучен более чем миллиону изображений и может классифицировать изображения на 1000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функций для широкого спектра изображений. Сеть принимает изображение в качестве входного и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов.

Transfer learning обычно используется в приложениях для глубокого обучения. Предварительно подготовленную сеть можно использовать в качестве отправной точки для изучения новой задачи. Точная настройка сети с обучением переносу обычно намного быстрее и проще, чем обучение сети с произвольно инициализированными весами с нуля. Вы можете быстро перенести изученные функции на новую задачу, используя меньшее количество обучающих изображений.

Загрузить данные

Распакуйте и загрузите новые образы как хранилище данных образов. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные в виде ImageDatastore объект. Хранилище данных изображения позволяет хранить большие данные изображения, включая данные, которые не помещаются в память, и эффективно считывать партии изображений во время обучения сверточной нейронной сети.

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Разделите данные на наборы данных обучения и проверки. Используйте 70% изображений для обучения и 30% для проверки. splitEachLabel разделяет images в два новых хранилища данных.

[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

Этот очень небольшой набор данных теперь содержит 55 обучающих изображений и 20 подтверждающих изображений. Отображение некоторых образцов изображений.

numTrainImages = numel(imdsTrain.Labels);
idx = randperm(numTrainImages,16);

I = imtile(imds, 'Frames', idx);

figure
imshow(I)

Загрузить предварительно обученную сеть

Загрузите предварительно обученную нейронную сеть SqueeExNet.

net = squeezenet;

Использовать analyzeNetwork отображение интерактивной визуализации сетевой архитектуры и подробной информации о сетевых уровнях.

analyzeNetwork(net)

Первый слой, изображение ввело слой, требует входных изображений размера 227 на 227 на 3, где 3 количество цветных каналов.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

Заменить конечные слои

Сверточные уровни сетевого извлеченного изображения отличаются тем, что последний обучаемый уровень и конечный уровень классификации используют для классификации входного изображения. Эти два слоя, 'conv10' и 'ClassificationLayer_predictions' в SqueeEnet, содержат информацию о том, как объединить функции, извлекаемые сетью, в вероятностях классов, значении потерь и прогнозируемых метках. Для переподготовки заранее обученной сети для классификации новых изображений замените эти два слоя новыми слоями, адаптированными к новому набору данных.

Извлеките график уровня из обученной сети.

lgraph = layerGraph(net); 

Найдите имена двух заменяемых слоев. Это можно сделать вручную или использовать вспомогательную функцию. findLayersToReplace для автоматического поиска этих слоев.

[learnableLayer,classLayer] = findLayersToReplace(lgraph);
[learnableLayer,classLayer] 
ans = 
  1×2 Layer array with layers:

     1   'conv10'                            Convolution             1000 1×1×512 convolutions with stride [1  1] and padding [0  0  0  0]
     2   'ClassificationLayer_predictions'   Classification Output   crossentropyex with 'tench' and 999 other classes

В большинстве сетей последний уровень с обучаемыми весами является полностью подключенным. В некоторых сетях, таких как SqueeEcnet, последним обучаемым уровнем является сверточный уровень 1 на 1. В этом случае замените сверточный слой новым сверточным слоем с количеством фильтров, равным числу классов. Чтобы быстрее учиться в новых слоях, чем в перенесенных слоях, увеличьте WeightLearnRateFactor и BiasLearnRateFactor значения сверточного слоя.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newConvLayer =  convolution2dLayer([1, 1],numClasses,'WeightLearnRateFactor',10,'BiasLearnRateFactor',10,"Name",'new_conv');
lgraph = replaceLayer(lgraph,'conv10',newConvLayer);

Уровень классификации определяет выходные классы сети. Замените классификационный слой новым без меток классов. trainNetwork автоматически устанавливает выходные классы слоя во время обучения.

newClassificatonLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassificatonLayer);

Железнодорожная сеть

Сеть требует входных изображений размером 227-на-227-на-3, но изображения в хранилищах данных изображений имеют разные размеры. Используйте хранилище данных дополненного изображения для автоматического изменения размеров обучающих изображений. Задайте дополнительные операции увеличения, выполняемые на обучающих изображениях: случайным образом переверните обучающие изображения вдоль вертикальной оси и перемещайте их случайным образом до 30 пикселей по горизонтали и вертикали. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.

pixelRange = [-30 30];
imageAugmenter = imageDataAugmenter( ...
    'RandXReflection',true, ...
    'RandXTranslation',pixelRange, ...
    'RandYTranslation',pixelRange);
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ...
    'DataAugmentation',imageAugmenter);

Чтобы автоматически изменять размер изображений проверки без дальнейшего увеличения данных, используйте хранилище данных дополненного изображения без указания дополнительных операций предварительной обработки.

augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

Укажите параметры обучения. Для обучения переносу следует сохранять элементы из ранних уровней предварительно обученной сети (веса передаваемого уровня). Чтобы замедлить обучение в перенесенных слоях, установите начальную скорость обучения на небольшое значение. На предыдущем шаге вы увеличили коэффициенты скорости обучения для сверточного уровня, чтобы ускорить обучение на новых конечных уровнях. Такое сочетание настроек скорости обучения приводит к быстрому обучению только на новых уровнях и более медленному обучению на других уровнях. При выполнении трансферного обучения не нужно тренироваться на столько же эпох. Эпоха - это полный цикл обучения по всему набору данных обучения. Укажите размер мини-партии 11, чтобы в каждой эпохе учитывать все данные. Программное обеспечение проверяет сеть каждый ValidationFrequency итерации во время обучения.

options = trainingOptions('sgdm', ...
    'MiniBatchSize',11, ...
    'MaxEpochs',7, ...
    'InitialLearnRate',2e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

Обучение сети, состоящей из перенесенного и нового уровней. По умолчанию trainNetwork использует графический процессор, если он доступен. Для этого требуется Toolbox™ параллельных вычислений и поддерживаемое устройство графического процессора. Сведения о поддерживаемых устройствах см. в разделе Поддержка графического процессора по выпуску (Parallel Computing Toolbox). В противном случае trainNetwork использует ЦП. Можно также указать среду выполнения с помощью 'ExecutionEnvironment' аргумент пары имя-значение trainingOptions.

netTransfer = trainNetwork(augimdsTrain,lgraph,options);

Классифицировать изображения проверки

Классифицируйте изображения проверки с помощью отлаженной сети.

[YPred,scores] = classify(netTransfer,augimdsValidation);

Отображение четырех образцов контрольных изображений с их прогнозируемыми метками.

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label));
end

Вычислите точность классификации в наборе проверки. Точность - это доля меток, которую сеть предсказывает правильно.

YValidation = imdsValidation.Labels;
accuracy = mean(YPred == YValidation)
accuracy = 1

Советы по повышению точности классификации см. в разделе Советы и рекомендации по глубокому обучению.

Чтение, изменение размеров и классификация изображения с помощью SqueeEcNet.

Сначала загрузите предварительно обученную модель SqueeeNet.

net = squeezenet;

Чтение изображения с помощью imread.

I = imread('peppers.png');
figure
imshow(I)

Figure contains an axes. The axes contains an object of type image.

Предварительно подготовленная модель требует, чтобы размер изображения был таким же, как входной размер сети. Определите входной размер сети с помощью InputSize свойство первого уровня сети.

sz = net.Layers(1).InputSize
sz = 1×3

   227   227     3

Измените размер изображения до входного размера сети.

I = imresize(I,sz(1:2));
figure
imshow(I)

Figure contains an axes. The axes contains an object of type image.

Классифицировать изображение с помощью classify.

label = classify(net,I)
label = categorical
     bell pepper 

Отображение изображения и результата классификации вместе.

figure
imshow(I)
title(label)

Figure contains an axes. The axes with title bell pepper contains an object of type image.

В этом примере показано, как извлечь изученные особенности изображения из предварительно обученной сверточной нейронной сети и использовать их для обучения классификатора изображений. Извлечение характеристик - самый простой и быстрый способ использования репрезентативной силы предварительно подготовленных глубоких сетей. Например, можно обучить вспомогательную векторную машину (SVM) с помощью fitcecoc (Статистика и Toolbox™ машинного обучения) по извлеченным функциям. Поскольку извлечение функций требует только одного прохода через данные, это хорошая отправная точка, если у вас нет графического процессора для ускорения обучения сети с помощью.

Загрузить данные

Распакуйте и загрузите образцы изображений как хранилище данных изображений. imageDatastore автоматически помечает изображения на основе имен папок и сохраняет данные в виде ImageDatastore объект. Хранилище данных изображения позволяет хранить большие данные изображения, включая данные, которые не помещаются в память. Разбейте данные на 70% обучающих и 30% тестовых данных.

unzip('MerchData.zip');

imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

[imdsTrain,imdsTest] = splitEachLabel(imds,0.7,'randomized');

Этот очень маленький набор данных теперь имеет 55 обучающих изображений и 20 подтверждающих изображений. Отображение некоторых образцов изображений.

numImagesTrain = numel(imdsTrain.Labels);
idx = randperm(numImagesTrain,16);

I = imtile(imds, 'Frames', idx);

figure
imshow(I)

Figure contains an axes. The axes contains an object of type image.

Загрузить предварительно обученную сеть

Загрузите предварительно обученную сеть SqueeEcNet. SqueeeNet обучен работе с более чем миллионом изображений и может классифицировать изображения по 1000 категориям объектов, например, клавиатура, мышь, карандаш и многие животные. В результате модель получила богатые представления элементов для широкого спектра изображений.

net = squeezenet;

Проанализируйте архитектуру сети.

analyzeNetwork(net)

Первый слой, изображение ввело слой, требует входных изображений размера 227 на 227 на 3, где 3 количество цветных каналов.

inputSize = net.Layers(1).InputSize
inputSize = 1×3

   227   227     3

Извлечь элементы изображения

Сеть создает иерархическое представление входных изображений. Более глубокие слои содержат элементы более высокого уровня, построенные с использованием элементов более низкого уровня более ранних слоев. Для получения функциональных представлений обучающих и тестовых изображений используйте activations на уровне глобального среднего объединения 'pool10'. Чтобы получить представление изображений более низкого уровня, используйте более ранний уровень в сети.

Сеть требует входных изображений размером 227-на-227-на-3, но изображения в хранилищах данных изображений имеют разные размеры. Чтобы автоматически изменить размер обучающих и тестовых изображений перед их вводом в сеть, создайте хранилища данных дополненных изображений, укажите требуемый размер изображения и используйте эти хранилища данных в качестве входных аргументов для activations.

augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsTest = augmentedImageDatastore(inputSize(1:2),imdsTest);

layer = 'pool10';
featuresTrain = activations(net,augimdsTrain,layer,'OutputAs','rows');
featuresTest = activations(net,augimdsTest,layer,'OutputAs','rows');

Извлеките метки класса из данных обучения и тестирования.

YTrain = imdsTrain.Labels;
YTest = imdsTest.Labels;

Классификатор изображения подгонки

Используйте функции, извлеченные из обучающих изображений, в качестве переменных предиктора и поместите многоклассную машину векторов поддержки (SVM), используя fitcecoc (Статистика и инструментарий машинного обучения).

mdl = fitcecoc(featuresTrain,YTrain);

Классификация тестовых изображений

Классифицируйте тестовые изображения с использованием обученной модели SVM и функций, извлеченных из тестовых изображений.

YPred = predict(mdl,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(label)
end

Figure contains 4 axes. Axes 1 with title MathWorks Cap contains an object of type image. Axes 2 with title MathWorks Cube contains an object of type image. Axes 3 with title MathWorks Playing Cards contains an object of type image. Axes 4 with title MathWorks Screwdriver contains an object of type image.

Рассчитайте точность классификации на тестовом наборе. Точность - это доля меток, которую сеть предсказывает правильно.

accuracy = mean(YPred == YTest)
accuracy = 1

Этот SVM имеет высокую точность. Если точность недостаточно высока с помощью извлечения элементов, попробуйте перенести обучение.

Выходные аргументы

свернуть все

Предварительно обученная сверточная нейронная сеть SqueeExNet, возвращенная как DAGNetwork объект.

Нетренированная архитектура сверточной нейронной сети SqueeENet, возвращенная как LayerGraph объект.

Ссылки

[1] ImageNet. http://www.image-net.org

[2] Иандола, Форрест Н., Сон Хан, Мэтью У. Москевич, Халид Ашраф, Уильям Дж. Далли и Курт Кейцер. «Точность на уровне SqueeNet: AlexNet с 50-кратным уменьшением параметров и размером модели < 0,5 МБ». Препринт, представлен 4 ноября 2016 года. https://arxiv.org/abs/1602.07360 .

[3] Иандола, Форрест Н. «SqueeEcNet». https://github.com/forresti/SqueezeNet.

Расширенные возможности

..
Представлен в R2018a