Моделируйте и проверьте нейронные сети для глубокого обучения без целевого компьютера

Быстрое прототипирование ваша пользовательская нейронная сеть для глубокого обучения и поток битов путем визуализации промежуточной активации слоя заканчивается и проверки точности предсказания без целевого компьютера путем эмуляции сети и потока битов. Чтобы эмулировать сеть и передать поток битов, создайте 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™

Загрузите предварительно обученный SeriesNetwork

Загружать предварительно обученную сеть 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)

Покажите активации первого слоя Maxpool

Исследуйте функции путем наблюдения, какие области в слоях свертки активируются на изображении. Сравните то изображение с соответствующими областями в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из названных каналов многих 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'

Смотрите также

| | |