Сверточная нейронная сеть AlexNet
AlexNet является сверточной нейронной сетью, которая является 8 слоями глубоко. Можно загрузить предварительно обученную версию сети, обученной больше чем на миллионе изображений от базы данных ImageNet [1]. Предварительно обученная сеть может классифицировать изображения в 1 000 категорий объектов, таких как клавиатура, мышь, карандаш и многие животные. В результате сеть изучила богатые представления функции для широкого спектра изображений. Сеть имеет входной размер изображений 227 227. Для большего количества предварительно обученных сетей в MATLAB®, смотрите Предварительно обученные Глубокие нейронные сети.
Можно использовать classify
классифицировать новые изображения с помощью сети AlexNet. Выполните шаги, Классифицируют Изображение Используя GoogLeNet и заменяют GoogLeNet на AlexNet.
Для свободного практического введения в практические методы глубокого обучения смотрите Глубокое обучение Onramp.
возвращает сеть AlexNet, обученную на наборе данных ImageNet.net
= alexnet
Эта функция требует Модели Deep Learning Toolbox™ для пакета Сетевой поддержки AlexNet. Если этот пакет поддержки не установлен, функция обеспечивает ссылку на загрузку. В качестве альтернативы см. Модель Deep Learning Toolbox для Сети AlexNet.
Для большего количества предварительно обученных сетей в MATLAB смотрите Предварительно обученные Глубокие нейронные сети.
возвращает сеть AlexNet, обученную на наборе данных ImageNet. Этот синтаксис эквивалентен net
= alexnet('Weights','imagenet'
)net = alexnet
.
возвращает нетренированную архитектуру сети AlexNet. Нетренированная модель не требует пакета поддержки.layers
= alexnet('Weights','none'
)
Загрузите и установите Модель 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
объект.
Визуализируйте сеть с помощью Deep Network Designer.
deepNetworkDesigner(alexnet)
Исследуйте другие предварительно обученные сети в Deep Network Designer путем нажатия на New.
Если необходимо загрузить сеть, сделать паузу в желаемой сети и нажать Install, чтобы открыть Add-On Explorer.
Этот пример использует:
В этом примере показано, как подстроить предварительно обученную сверточную нейронную сеть AlexNet, чтобы выполнить классификацию на новом наборе изображений.
AlexNet был обучен на более чем миллионе изображений и может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, кофейная кружка, карандаш и многие животные). Сеть изучила богатые представления функции для широкого спектра изображений. Сеть берет изображение в качестве входа и выводит метку для объекта в изображении вместе с вероятностями для каждой из категорий объектов.
Передача обучения обычно используется в применении глубокого обучения. Можно взять предварительно обученную сеть и использовать ее в качестве начальной точки, чтобы изучить новую задачу. Подстройка сети с передачей обучения обычно намного быстрее и легче, чем обучение сети со случайным образом инициализированными весами с нуля. Можно быстро передать изученные функции новой задаче с помощью меньшего числа учебных изображений.
Загрузка данных
Разархивируйте и загрузите новые изображения как datastore изображений. imageDatastore
автоматически помечает изображения на основе имен папок и хранит данные как ImageDatastore
объект. 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™ для Сети 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™ и поддерживаемого устройства графического процессора. Для получения информации о поддерживаемых устройствах смотрите Поддержку графического процессора Релизом (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™) на извлеченных функциях. Поскольку извлечение признаков только требует одного прохода через данные, это - хорошая начальная точка, если у вас нет графического процессора, чтобы ускорить сетевое обучение с.
Загрузка данных
Разархивируйте и загрузите демонстрационные изображения как 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 изображений валидации в этом очень небольшом наборе данных. Отобразите некоторые демонстрационные изображения.
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 для пакета Сетевой поддержки 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).
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 имеет высокую точность. Если точность высоко достаточно не использует извлечение признаков, то попробуйте передачу обучения вместо этого.
net
— Сверточная нейронная сеть Pretrained AlexNetSeriesNetwork
объект Предварительно обученная сверточная нейронная сеть AlexNet, возвращенная как SeriesNetwork
объект.
layers
— Нетренированная архитектура сверточной нейронной сети AlexNetLayer
массив Нетренированная архитектура сверточной нейронной сети AlexNet, возвращенная как Layer
массив.
Для свободного практического введения в практические методы глубокого обучения смотрите Глубокое обучение 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
Для генерации кода можно загрузить сеть при помощи синтаксиса net = alexnet
или путем передачи alexnet
функция к coder.loadDeepLearningNetwork
(MATLAB Coder). Например: net = coder.loadDeepLearningNetwork('alexnet')
.
Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода (MATLAB Coder).
Синтаксис alexnet('Weights','none')
не поддерживается для генерации кода.
Указания и ограничения по применению:
Для генерации кода можно загрузить сеть при помощи синтаксиса net = alexnet
или путем передачи alexnet
функция к coder.loadDeepLearningNetwork
(GPU Coder). Например: net = coder.loadDeepLearningNetwork('alexnet')
.
Для получения дополнительной информации смотрите Предварительно обученные сети Загрузки для Генерации кода (GPU Coder).
Синтаксис alexnet('Weights','none')
не поддерживается для генерации кода графического процессора.
Deep Network Designer | vgg16
| vgg19
| resnet18
| resnet50
| densenet201
| googlenet
| inceptionresnetv2
| squeezenet
| importKerasNetwork
| importCaffeNetwork
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.