Быстрое прототипирование ваша пользовательская нейронная сеть для глубокого обучения и поток битов путем визуализации промежуточной активации слоя заканчивается и проверки точности предсказания без целевого компьютера путем эмуляции сети и потока битов. Чтобы эмулировать сеть и передать поток битов, создайте dlhdl.Simulator
объект. Используйте dlhdl.Simulator
объект к:
Получите промежуточные результаты слоя при помощи activations
функция.
Проверьте точность предсказания при помощи predict
функция.
В этом примере получите промежуточные результаты активации слоя и проверьте точность предсказания для сети ResNet-18 и настройку процессора глубокого обучения для zcu102_single
поток битов.
Deep Learning Toolbox ™
Deep Learning HDL Toolbox ™
Модель Deep Learning Toolbox для сети ResNet-18
Пакет поддержки Deep Learning HDL Toolbox для FPGA Xilinx и устройств SoC
Image Processing Toolbox ™
Интерфейс MATLAB Coder для Глубокого обучения Libraries™
Загружать предварительно обученную сеть ResNet-18, введите:
snet = resnet18;
Просмотреть слои предварительно обученной сети, введите:
analyzeNetwork(snet);
Первый слой, изображение ввело слой, требует входных изображений размера 224 224 3, где 3 количество цветовых каналов.
inputSize = snet.Layers(1).InputSize;
Этот пример использует MathWorks
Набор данных MerchData. Это - небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежа пяти различным классам (дно, куб, игра в карты, отвертка и факел).
curDir = pwd; unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Полносвязный слой и слой классификации предварительно обученной сети net
сконфигурированы для 1 000 классов. Эти два слоя fc1000
и ClassificationLayer_predictions
в ResNet-18 содержат информацию о том, как сочетать функции, которые сеть извлекает в вероятности класса и предсказанные метки. Эти слои должны быть подстроены для новой проблемы классификации. Извлеките все слои, кроме последних двух слоев, от предварительно обученной сети.
lgraph = layerGraph(snet)
lgraph = LayerGraph with properties: Layers: [71×1 nnet.cnn.layer.Layer] Connections: [78×2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses, ... 'Name','new_fc', ... 'WeightLearnRateFactor',10, ... 'BiasLearnRateFactor',10); lgraph = replaceLayer(lgraph,'fc1000',newLearnableLayer); newClassLayer = classificationLayer('Name','new_classoutput'); lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);
Сеть требует входных изображений размера 224 224 3, но изображения в хранилищах данных изображений имеют различные размеры. Используйте увеличенный datastore изображений, чтобы автоматически изменить размер учебных изображений. Задайте дополнительные операции увеличения, чтобы выполнить на учебных изображениях, таких как случайное зеркальное отражение учебных изображений вдоль вертикальной оси и случайным образом перевода их до 30 пикселей горизонтально и вертикально. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений.
pixelRange = [-30 30]; imageAugmenter = imageDataAugmenter( ... 'RandXReflection',true, ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange);
Чтобы автоматически изменить размер изображений валидации, не выполняя дальнейшее увеличение данных, используйте увеличенный datastore изображений, не задавая дополнительных операций предварительной обработки.
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
использует графический процессор, если вы доступны (требует Parallel Computing Toolbox™ и поддерживаемого устройства графического процессора. Смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox)). В противном случае сеть использует центральный процессор (требует Интерфейса MATLAB Coder для Глубокого обучения Libraries™). Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент значения имени trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
Используйте dlhdl.ProcessorConfig
объект получить настройку процессора глубокого обучения для zcu102_single
поток битов.
hPC = dlhdl.ProcessorConfig('Bitstream','zcu102_single');
Создайте dlhdl.Simulator
объект с ResNet-18 как сеть и hPC
как ProcessorConfig
объект.
simObj = dlhdl.Simulator('Network',netTransfer,'ProcessorConfig',hPC);
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer' ### Notice: The layer 'data' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'out_data' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv1>>pool1 ... ### Notice: The layer 'data' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv1>>pool1 ... complete. Compiling leg: res2a_branch2a>>res2a_branch2b ... ### Notice: The layer 'pool1' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res2a_branch2a>>res2a_branch2b ... complete. Compiling leg: res2b_branch2a>>res2b_branch2b ... ### Notice: The layer 'res2a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res2b_branch2a>>res2b_branch2b ... complete. Compiling leg: res3a_branch1 ... ### Notice: The layer 'res2b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3a_branch1 ... complete. Compiling leg: res3a_branch2a>>res3a_branch2b ... ### Notice: The layer 'res2b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3a_branch2a>>res3a_branch2b ... complete. Compiling leg: res3b_branch2a>>res3b_branch2b ... ### Notice: The layer 'res3a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3b_branch2a>>res3b_branch2b ... complete. Compiling leg: res4a_branch1 ... ### Notice: The layer 'res3b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4a_branch1 ... complete. Compiling leg: res4a_branch2a>>res4a_branch2b ... ### Notice: The layer 'res3b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4a_branch2a>>res4a_branch2b ... complete. Compiling leg: res4b_branch2a>>res4b_branch2b ... ### Notice: The layer 'res4a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4b_branch2a>>res4b_branch2b ... complete. Compiling leg: res5a_branch1 ... ### Notice: The layer 'res4b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5a_branch1 ... complete. Compiling leg: res5a_branch2a>>res5a_branch2b ... ### Notice: The layer 'res4b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5a_branch2a>>res5a_branch2b ... complete. Compiling leg: res5b_branch2a>>res5b_branch2b ... ### Notice: The layer 'res5a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5b_branch2a>>res5b_branch2b ... complete. Compiling leg: pool5 ... ### Notice: The layer 'res5b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: pool5 ... complete. Compiling leg: new_fc ... ### Notice: The layer 'pool5' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: new_fc ... complete. ### Should not enter here. It means a component is unaccounted for in MATLAB Emulation. ### Notice: The layer 'new_fc' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'prob' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software. ### Notice: The layer 'new_classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
Загрузите изображение в качестве примера. Сохраните это - размер для будущего использования.
imgFile = fullfile(pwd,'MerchData','MathWorks Cube','Mathworks cube_0.jpg'); inputImg = imresize(imread(imgFile),inputSize(1:2)); imshow(inputImg)
Исследуйте функции путем наблюдения, какие области в слоях свертки активируются на изображении. Сравните то изображение с соответствующими областями в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из названных каналов многих 2D массивов. Передайте изображение через сеть и исследуйте выходные активации pool1
слой.
act1 = simObj.activations(single(inputImg),'pool1');
Активации возвращены как трехмерный массив с третьей размерностью, индексирующей канал на pool1
слой. Показать эти активации при помощи imtile
функционируйте, измените размерность массива к 4-D. Третья размерность во входе к imtile
представляет цвет изображения. Установите третью размерность иметь размер 1, потому что активации не имеют цвета. Четвертая размерность индексирует канал.
sz = size(act1); act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);
Отобразите активации. Каждая активация может принять любое значение, поэтому нормировать выход при помощи mat2gray
. Все активации масштабируются так, чтобы минимальная активация была 0, и максимальная активация равняется 1. Отобразите 64 изображения на 8 8 сетка, один для каждого канала в слое.
I = imtile(mat2gray(act1),'GridSize',[8 8]);
imshow(I)
Найдите самые сильные каналы, программно исследовав каналы с большими активациями. Найдите канал, который имеет самую большую активацию при помощи max
функционируйте, измените размер канала выход и отобразите активации.
[maxValue,maxValueIndex] = max(max(max(act1))); act1chMax = act1(:,:,:,maxValueIndex); act1chMax = mat2gray(act1chMax); act1chMax = imresize(act1chMax,inputSize(1:2)); I = imtile({inputImg,act1chMax}); imshow(I)
Сравните самое сильное изображение канала активации с оригинальным изображением. Этот канал активируется на ребрах. Это активируется положительно на легких левых/темных правых краях и негативно на темных левых/легких правых краях.
Проверьте и отобразите результаты предсказания dlhdl.Simulator
объект при помощи predict
функция.
prediction = simObj.predict(single(inputImg)); [val, idx] = max(prediction); netTransfer.Layers(end).ClassNames{idx}
ans = 'MathWorks Cube'
dlhdl.Simulator
| activations
| predict
| dlhdl.ProcessorConfig