alexnet

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

Описание

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

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

Для свободного практического введения в практические методы глубокого обучения смотрите Deep Learning Onramp.

пример

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

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

Для получения дополнительной информации о предварительно обученных сетях в MATLAB, смотрите Pretrained Deep Neural Networks.

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 Explorer. Чтобы установить пакет поддержки, щелкните ссылку и нажмите кнопку Install. Проверьте успешность установки путем ввода alexnet в командной строке.

alexnet
ans = 

  SeriesNetwork with properties:

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

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

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

deepNetworkDesigner(alexnet)

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

Если необходимо загрузить сеть, нажмите кнопку Install, чтобы открыть Add-On Explorer.

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

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

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

Загрузка данных

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

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

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

[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™ Model для 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);

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

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 использует графический процессор, если он доступен, в противном случае используется центральный процессор. Для обучения на графическом процессоре требуется Parallel Computing Toolbox™ и поддерживаемое устройство GPU. Для получения информации о поддерживаемых устройствах смотрите Поддержку GPU by Release (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 (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 изображений для валидации. Отобразите некоторые образцовые изображения.

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 (Statistics and Machine Learning Toolbox).

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 массив.

Совет

  • Для свободного практического введения в практические методы глубокого обучения смотрите Deep Learning Onramp.

Ссылки

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

[2] Russakovsky, O., Deng, J., Su, H., et al. «Большой масштабный вызов визуального распознавания ImageNet». Международный журнал компьютерного зрения (IJCV). Том 115, Выпуск 3, 2015, стр. 211-252

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

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

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

..
Введенный в R2017a