alexnet

Предварительно обученный AlexNet сверточная нейронная сеть

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

Можно использовать classify, чтобы классифицировать новые изображения с помощью сети AlexNet. Выполните шаги, Классифицируют Изображение Используя GoogLeNet и заменяют GoogLeNet на AlexNet.

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

Синтаксис

net = alexnet

Описание

пример

net = alexnet возвращает предварительно обученную сеть AlexNet.

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

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

Примеры

свернуть все

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

Введите alexnet в командной строке.

alexnet

Если Модель Deep Learning Toolbox для пакета Сетевой поддержки AlexNet не установлена, то функция обеспечивает ссылку на необходимый пакет поддержки в Add-On Explorer. Чтобы установить пакет поддержки, щелкните по ссылке, и затем нажмите Install. Проверяйте, что установка успешна путем ввода alexnet в командной строке.

alexnet
ans = 

  SeriesNetwork with properties:

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

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

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

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

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

net = alexnet;

Сеть импорта в Deep Network Designer

Открытый Deep Network Designer.

deepNetworkDesigner

Нажмите Import и выберите сеть из рабочей области. Deep Network Designer отображает уменьшивший масштаб представление целой сети. Исследуйте сетевой график. Чтобы увеличить масштаб с мышью, используйте колесо Ctrl+scroll.

Сеть редактирования для изучения передачи

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

Перетащите новый fullyConnectedLayer из Библиотеки Слоя на холст. Отредактируйте OutputSize к количеству классов в новых данных, в этом примере, 5.

Отредактируйте темпы обучения, чтобы учиться быстрее в новых слоях, чем в переданных слоях. Установите WeightLearnRateFactor и BiasLearnRateFactor к 10. Удалите исходный слой и соедините свой новый слой вместо этого.

Замените выходной слой. Прокрутите в конец Библиотеки Слоя и перетащите новый classificationLayer на холст. Удалите исходный слой output и соедините свой новый слой вместо этого.

Проверяйте сеть

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

Сеть экспорта для обучения

Возвратитесь к Deep Network Designer и нажмите Export. Deep Network Designer экспортирует сеть в новую переменную под названием layers_1, содержащий отредактированные сетевые слои. Можно теперь предоставить переменную слоя к функции trainNetwork.

Загрузка данных и обучение сети

Разархивируйте и загрузите новые изображения как datastore изображений. Разделите данные на 70% данных тренировки и 30%-х данных о валидации.

unzip('MerchData.zip');
imds = imageDatastore('MerchData','IncludeSubfolders',true,'LabelSource','foldernames');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');

Измените размер изображений, чтобы совпадать с входным размером предварительно обученной сети.

augimdsTrain = augmentedImageDatastore([227 227],imdsTrain);
augimdsValidation = augmentedImageDatastore([227 227],imdsValidation);

Задайте опции обучения.

  • Задайте мини-пакетный размер, то есть, сколько изображений, чтобы использовать в каждой итерации.

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

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

  • Задайте данные о валидации и частоту валидации так, чтобы точность на данных о валидации была вычислена один раз в эпоху.

  • Включите учебный график контролировать прогресс, в то время как вы обучаетесь.

miniBatchSize = 10;
valFrequency = floor(numel(augimdsTrain.Files)/miniBatchSize);
options = trainingOptions('sgdm', ...
    'MiniBatchSize',miniBatchSize, ...
    'MaxEpochs',5, ...
    'InitialLearnRate',3e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',valFrequency, ...
    'Verbose',false, ...
    'Plots','training-progress');

Чтобы обучить сеть, предоставьте слои, экспортируемые из приложения, layers_1, учебных изображений и опций, к функции trainNetwork. По умолчанию trainNetwork использует графический процессор при наличии (требует Parallel Computing Toolbox™). В противном случае это использует центральный процессор. Обучение быстро, потому что набор данных является настолько небольшим.

trainedNet = trainNetwork(augimdsTrain,layers_1,options);

Тест обучил сеть

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

[YPred,probs] = classify(trainedNet,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

Отобразите четыре демонстрационных изображения валидации с предсказанными метками и предсказанными вероятностями.

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) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

Чтобы узнать больше и попробовать другие предварительно обученные сети, смотрите Deep Network Designer.

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

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

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

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

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

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

Разделите данные на наборы данных обучения и валидации. Используйте 70% изображений для обучения и 30% для валидации. splitEachLabel разделяет datastore 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 не установлена, то программное обеспечение обеспечивает ссылку на загрузку. AlexNet обучен больше чем на одном миллионе изображений и может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате модель изучила богатые представления функции для широкого спектра изображений.

net = alexnet;

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

analyzeNetwork(net)

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

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

   227   227     3

Замените последние слои

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

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, но изображения в хранилищах данных изображений имеют различные размеры. Используйте увеличенный datastore изображений, чтобы автоматически изменить размер учебных изображений. Задайте дополнительные операции увеличения, чтобы выполнить на учебных изображениях: случайным образом инвертируйте учебные изображения вдоль вертикальной оси, и случайным образом переведите их до 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™, и CUDA® включил графический процессор с, вычисляют возможность 3.0 или выше). В противном случае это использует центральный процессор. Можно также задать среду выполнения при помощи аргумента пары "имя-значение" '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

Обрежьте изображение к входному размеру сети. Также можно изменить размер изображения с помощью imresize.

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

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

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

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

figure
imshow(I)
title(char(label))

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

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

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

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).

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

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

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

свернуть все

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

Советы

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

Ссылки

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

[2] Russakovsky, O., Дэн, J., Су, H., и др. "Крупный масштаб ImageNet Визуальная проблема Распознавания". Международный журнал Компьютерного зрения (IJCV). Vol 115, Выпуск 3, 2015, стр 211–252

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

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

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

Введенный в R2017a