exponenta event banner

alexnet

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

Описание

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

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

Бесплатное практическое введение в практические методы глубокого обучения см. в разделе Глубокое обучение Onramp.

пример

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

Для этой функции требуется Deep Learning Toolbox™ Model для пакета поддержки AlexNet Network. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки. Кроме того, см. раздел Модель инструментария глубокого обучения для AlexNet Network.

Дополнительные сведения о предварительно подготовленных сетях в MATLAB см. в разделе Предварительно обученные глубокие нейронные сети.

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

layers = alexnet('Weights','none') возвращает необученную сетевую архитектуру AlexNet. Неподготовленная модель не требует пакета поддержки.

Примеры

свернуть все

Загрузите и установите Deep Learning Toolbox Model для пакета поддержки AlexNet Network.

Напечатать alexnet в командной строке.

alexnet

Если Deep Learning Toolbox Model для пакета поддержки AlexNet Network не установлен, то функция предоставляет ссылку на требуемый пакет поддержки в проводнике Add-On. Чтобы установить пакет поддержки, щелкните ссылку и нажмите кнопку Установить. Убедитесь, что установка выполнена успешно, введя alexnet в командной строке.

alexnet
ans = 

  SeriesNetwork with properties:

    Layers: [25×1 nnet.cnn.layer.Layer]

Если установлен необходимый пакет поддержки, функция возвращает SeriesNetwork объект.

Визуализация сети с помощью Deep Network Designer.

deepNetworkDesigner(alexnet)

Изучите другие предварительно подготовленные сети в Deep Network Designer, нажав кнопку Создать.

Если необходимо загрузить сеть, нажмите кнопку Установить, чтобы открыть обозреватель надстроек.

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

AlexNet прошел обучение на более чем миллионе изображений и может классифицировать изображения на 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);
figure
for i = 1:16
    subplot(4,4,i)
    I = readimage(imdsTrain,idx(i));
    imshow(I)
end

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

Загрузите предварительно обученную нейронную сеть AlexNet. Если модель Deep Learning Toolbox™ для AlexNet Network не установлена, программное обеспечение предоставляет ссылку для загрузки. AlexNet обучен работе с более чем одним миллионом изображений и может классифицировать изображения на 1000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате модель получила богатые представления элементов для широкого спектра изображений.

net = alexnet;

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

analyzeNetwork(net)

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

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

   227   227     3

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

Последние три уровня предварительно обученной сети net сконфигурированы для 1000 классов. Эти три уровня должны быть точно настроены для новой задачи классификации. Извлеките все слои, за исключением последних трех, из предварительно подготовленной сети.

layersTransfer = net.Layers(1:end-3);

Перенесите слои в новую задачу классификации, заменив последние три уровня полностью подключенным уровнем, уровнем softmax и выходным уровнем классификации. Задайте параметры нового полностью подключенного слоя в соответствии с новыми данными. Установите для полностью подключенного слоя тот же размер, что и для количества классов в новых данных. Чтобы быстрее учиться в новых слоях, чем в перенесенных слоях, увеличьте WeightLearnRateFactor и BiasLearnRateFactor значения полностью подключенного слоя.

numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
layers = [
    layersTransfer
    fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20)
    softmaxLayer
    classificationLayer];

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

Сеть требует входных изображений размером 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);

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

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

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

netTransfer = trainNetwork(augimdsTrain,layers,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

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

Чтение, изменение размеров и классификация изображения с помощью AlexNet. Сначала загрузите предварительно подготовленную модель AlexNet.

net = alexnet;

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

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

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

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

   227   227     3

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

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

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

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

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

figure
imshow(I)
title(label)

В этом примере показано, как извлечь изученные особенности изображения из предварительно обученной сверточной нейронной сети и использовать их для обучения классификатора изображений. Извлечение характеристик - самый простой и быстрый способ использования репрезентативной силы предварительно подготовленных глубоких сетей. Например, можно обучить вспомогательную векторную машину (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);

for i = 1:16
    I{i} = readimage(imdsTrain,idx(i));
end

figure
imshow(imtile(I))

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

Загрузите предварительно обученную сеть AlexNet. Если не установлен пакет поддержки Deep Learning Toolbox Model для AlexNet Network, то программное обеспечение предоставляет ссылку на загрузку. AlexNet обучен работе с более чем миллионом изображений и может классифицировать изображения по 1000 категориям объектов. Например, клавиатура, мышь, карандаш и много животных. В результате модель получила богатые представления элементов для широкого спектра изображений.

net = alexnet;

Отображение сетевой архитектуры. Сеть имеет пять сверточных уровней и три полностью соединенных уровня.

net.Layers
ans = 
  25x1 Layer array with layers:

     1   'data'     Image Input                   227x227x3 images with 'zerocenter' normalization
     2   'conv1'    Convolution                   96 11x11x3 convolutions with stride [4  4] and padding [0  0  0  0]
     3   'relu1'    ReLU                          ReLU
     4   'norm1'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     5   'pool1'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
     6   'conv2'    Grouped Convolution           2 groups of 128 5x5x48 convolutions with stride [1  1] and padding [2  2  2  2]
     7   'relu2'    ReLU                          ReLU
     8   'norm2'    Cross Channel Normalization   cross channel normalization with 5 channels per element
     9   'pool2'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    10   'conv3'    Convolution                   384 3x3x256 convolutions with stride [1  1] and padding [1  1  1  1]
    11   'relu3'    ReLU                          ReLU
    12   'conv4'    Grouped Convolution           2 groups of 192 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    13   'relu4'    ReLU                          ReLU
    14   'conv5'    Grouped Convolution           2 groups of 128 3x3x192 convolutions with stride [1  1] and padding [1  1  1  1]
    15   'relu5'    ReLU                          ReLU
    16   'pool5'    Max Pooling                   3x3 max pooling with stride [2  2] and padding [0  0  0  0]
    17   'fc6'      Fully Connected               4096 fully connected layer
    18   'relu6'    ReLU                          ReLU
    19   'drop6'    Dropout                       50% dropout
    20   'fc7'      Fully Connected               4096 fully connected layer
    21   'relu7'    ReLU                          ReLU
    22   'drop7'    Dropout                       50% dropout
    23   'fc8'      Fully Connected               1000 fully connected layer
    24   'prob'     Softmax                       softmax
    25   'output'   Classification Output         crossentropyex with 'tench' and 999 other classes

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

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

   227   227     3

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

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

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

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

layer = 'fc7';
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

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

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

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

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

свернуть все

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

Необученная архитектура сверточной нейронной сети AlexNet, возвращенная как Layer массив.

Совет

  • Бесплатное практическое введение в практические методы глубокого обучения см. в разделе Глубокое обучение Onramp.

Ссылки

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

[2] Руссаковский, О., Денг, Дж., Су, Х., и др. «Задача масштабного визуального распознавания ImageNet». Международный журнал компьютерного зрения (IJCV). Том 115, выпуск 3, 2015, стр. 211-252

[3] Крижевский, Алекс, Илья Суцкевер, и Жоффруа Э. Хинтон. «ImageNet Classification с глубокими сверточными нейронными сетями». Достижения в системах обработки нейронной информации. 2012.

[4] Модель AlexNet BVLC. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

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

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