В этом примере показано, как обучаться, скомпилируйте и разверните dlhdl.Workflow объект, который квантовал Alexnet как сетевой объект при помощи Пакета поддержки Deep Learning HDL Toolbox™ для FPGA Xilinx и SoC. Квантование помогает уменьшать требования к памяти глубокой нейронной сети путем квантования весов, смещений и активаций слоев сети к 8-битным масштабированным целочисленным типам данных. Использование MATLAB®, чтобы получить предсказание следует из целевого устройства.
В данном примере вам нужно:
Deep Learning Toolbox ™
Deep Learning HDL Toolbox ™
Библиотека квантования модели Deep Learning Toolbox
Пакет поддержки Deep Learning HDL Toolbox для FPGA Xilinx и устройств SoC
Интерфейс MATLAB Coder для библиотек глубокого обучения.
Загружать предварительно обученную серийную сеть AlexNet, введите:
snet = alexnet;
Просмотреть слои предварительно обученной серийной сети, введите:
analyzeNetwork(snet);
Первый слой, входной слой для изображений, требует входных изображений размера 227 227 3, где 3 количество цветовых каналов.
inputSize = snet.Layers(1).InputSize;
inputSize = 1×3
227 227 3
Этот пример использует the logos_dataset набор данных. Набор данных состоит из 320 изображений. Создайте augmentedImageDatastore возразите, чтобы использовать для обучения и валидации.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir,'f'); unzip('logos_dataset.zip'); imds = imageDatastore('logos_dataset', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Последние три слоя предварительно обученной сети net сконфигурированы для 1 000 классов. Эти три слоя должны быть подстроены для новой проблемы классификации. Извлеките все слои, кроме последних трех слоев, от предварительно обученной сети.
layersTransfer = snet.Layers(1:end-3);
Передайте слои новой задаче классификации, заменив последние три слоя на полносвязный слой, softmax слой и классификацию выходной слой. Установите полносвязный слой иметь тот же размер как количество классов в новых данных.
numClasses = numel(categories(imdsTrain.Labels));
numClasses = 32
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)). В противном случае сеть использует центральный процессор (требует Интерфейса MATLAB Coder для Глубокого обучения Libraries™). Можно также задать среду выполнения при помощи 'ExecutionEnvironment' аргумент значения имени trainingOptions.
netTransfer = trainNetwork(augimdsTrain,layers,options);

dlquantizer ОбъектСоздайте dlquantizer возразите и задайте сеть, чтобы квантовать. Задайте среду выполнения как FPGA.
dlQuantObj = dlquantizer(netTransfer,'ExecutionEnvironment','FPGA');
The dlquantizer возразите калибровочным данным об использовании, чтобы собрать динамические диапазоны для настраиваемых параметров свертки и полносвязных слоев сети.
Для лучших результатов квантования калибровочные данные должны быть представителем фактических входных параметров, предсказанных сетью LogoNet. Ускорьте калибровочный процесс путем сокращения калибровочного набора данных до 20 изображений.
imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); imageData_reduced = imageData.subset(1:20); dlQuantObj.calibrate(imageData_reduced)
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Набор Проекта Xilinx™ Vivado™ 2020.1. Установить Xilinx Vivado toolpath, введите:
% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.1\bin\vivado.bat');Создать целевой объект, введите:
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');
В качестве альтернативы можно также использовать интерфейс JTAG.
% hTarget = dlhdl.Target('Xilinx', 'Interface', 'JTAG');Создайте объект dlhdl.Workflow класс. Когда вы создаете класс, экземпляр объекта dlquantizer, имени потока битов, и целевая информация указана. Задайте dlQuantObj как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx, и поток битов использует int8 тип данных.
hW = dlhdl.Workflow('Network', dlQuantObj, 'Bitstream', 'zcu102_int8','Target',hTarget);
Чтобы скомпилировать квантованную сеть серии AlexNet, запустите функцию компиляции dlhdl.Workflow объект.
dn = hW.compile
### Compiling network for Deep Learning FPGA prototyping ...
### Targeting FPGA bitstream zcu102_int8 ...
### The network includes the following layers:
1 'data' Image Input 227×227×3 images with 'zerocenter' normalization (SW Layer)
2 'conv1' Convolution 96 11×11×3 convolutions with stride [4 4] and padding [0 0 0 0] (HW Layer)
3 'relu1' ReLU ReLU (HW Layer)
4 'norm1' Cross Channel Normalization cross channel normalization with 5 channels per element (HW Layer)
5 'pool1' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer)
6 'conv2' Grouped Convolution 2 groups of 128 5×5×48 convolutions with stride [1 1] and padding [2 2 2 2] (HW Layer)
7 'relu2' ReLU ReLU (HW Layer)
8 'norm2' Cross Channel Normalization cross channel normalization with 5 channels per element (HW Layer)
9 'pool2' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer)
10 'conv3' Convolution 384 3×3×256 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer)
11 'relu3' ReLU ReLU (HW Layer)
12 'conv4' Grouped Convolution 2 groups of 192 3×3×192 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer)
13 'relu4' ReLU ReLU (HW Layer)
14 'conv5' Grouped Convolution 2 groups of 128 3×3×192 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer)
15 'relu5' ReLU ReLU (HW Layer)
16 'pool5' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer)
17 'fc6' Fully Connected 4096 fully connected layer (HW Layer)
18 'relu6' ReLU ReLU (HW Layer)
19 'drop6' Dropout 50% dropout (HW Layer)
20 'fc7' Fully Connected 4096 fully connected layer (HW Layer)
21 'relu7' ReLU ReLU (HW Layer)
22 'drop7' Dropout 50% dropout (HW Layer)
23 'fc' Fully Connected 32 fully connected layer (HW Layer)
24 'softmax' Softmax softmax (SW Layer)
25 'classoutput' Classification Output crossentropyex with 'adidas' and 31 other classes (SW Layer)
3 Memory Regions created.
Skipping: data
Compiling leg: conv1>>pool5 ...
Compiling leg: conv1>>pool5 ... complete.
Compiling leg: fc6>>fc ...
Compiling leg: fc6>>fc ... complete.
Skipping: softmax
Skipping: classoutput
Creating Schedule...
.........
Creating Schedule...complete.
Creating Status Table...
........
Creating Status Table...complete.
Emitting Schedule...
......
Emitting Schedule...complete.
Emitting Status Table...
..........
Emitting Status Table...complete.
### Allocating external memory buffers:
offset_name offset_address allocated_space
_______________________ ______________ _________________
"InputDataOffset" "0x00000000" "48.0 MB"
"OutputResultOffset" "0x03000000" "4.0 MB"
"SchedulerDataOffset" "0x03400000" "4.0 MB"
"SystemBufferOffset" "0x03800000" "28.0 MB"
"InstructionDataOffset" "0x05400000" "4.0 MB"
"ConvWeightDataOffset" "0x05800000" "8.0 MB"
"FCWeightDataOffset" "0x06000000" "56.0 MB"
"EndOffset" "0x09800000" "Total: 152.0 MB"
### Network compilation complete.
dn = struct with fields:
weights: [1×1 struct]
instructions: [1×1 struct]
registers: [1×1 struct]
syncInstructions: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZCU102 SoC, запустите развернуть функцию dlhdl.Workflow объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть функция начинает программировать устройство FPGA, сообщения о ходе выполнения отображений, и время, которое требуется, чтобы развернуть сеть.
hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Loading weights to Conv Processor. ### Conv Weights loaded. Current time is 17-Dec-2020 11:06:56 ### Loading weights to FC Processor. ### 33% finished, current time is 17-Dec-2020 11:06:57. ### 67% finished, current time is 17-Dec-2020 11:06:59. ### FC Weights loaded. Current time is 17-Dec-2020 11:06:59
Чтобы загрузить изображение в качестве примера, выполните predict функция dlhdl.Workflow объект, и затем отображает результат FPGA, введите:
idx = randperm(numel(imdsValidation.Files),4); figure for i = 1:4 subplot(2,2,i) I = readimage(imdsValidation,idx(i)); imshow(I) [prediction, speed] = hW.predict(single(I),'Profile','on'); [val, index] = max(prediction); netTransfer.Layers(end).ClassNames{index} label = netTransfer.Layers(end).ClassNames{index} title(string(label)); end
### Finished writing input activations.
### Running single input activations.
Deep Learning Processor Profiler Performance Results
LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s
------------- ------------- --------- --------- ---------
Network 9088267 0.04131 1 9088267 24.2
conv1 713071 0.00324
norm1 460546 0.00209
pool1 88791 0.00040
conv2 911059 0.00414
norm2 270230 0.00123
pool2 92782 0.00042
conv3 297066 0.00135
conv4 238155 0.00108
conv5 166248 0.00076
pool5 19576 0.00009
fc6 3955696 0.01798
fc7 1757863 0.00799
fc 117059 0.00053
* The clock frequency of the DL processor is: 220MHz
ans = 'ford'
label = 'ford'
### Finished writing input activations.
### Running single input activations.
Deep Learning Processor Profiler Performance Results
LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s
------------- ------------- --------- --------- ---------
Network 9088122 0.04131 1 9088122 24.2
conv1 713003 0.00324
norm1 460513 0.00209
pool1 89083 0.00040
conv2 910726 0.00414
norm2 270238 0.00123
pool2 92773 0.00042
conv3 297151 0.00135
conv4 238132 0.00108
conv5 166415 0.00076
pool5 19561 0.00009
fc6 3955517 0.01798
fc7 1757860 0.00799
fc 117054 0.00053
* The clock frequency of the DL processor is: 220MHz
ans = 'bmw'
label = 'bmw'
### Finished writing input activations.
### Running single input activations.
Deep Learning Processor Profiler Performance Results
LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s
------------- ------------- --------- --------- ---------
Network 9088305 0.04131 1 9088305 24.2
conv1 713031 0.00324
norm1 460263 0.00209
pool1 88948 0.00040
conv2 911216 0.00414
norm2 270247 0.00123
pool2 92514 0.00042
conv3 297124 0.00135
conv4 238252 0.00108
conv5 166320 0.00076
pool5 19519 0.00009
fc6 3955853 0.01798
fc7 1757867 0.00799
fc 117055 0.00053
* The clock frequency of the DL processor is: 220MHz
ans = 'aldi'
label = 'aldi'
### Finished writing input activations.
### Running single input activations.
Deep Learning Processor Profiler Performance Results
LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s
------------- ------------- --------- --------- ---------
Network 9088168 0.04131 1 9088168 24.2
conv1 713087 0.00324
norm1 460226 0.00209
pool1 89136 0.00041
conv2 910865 0.00414
norm2 270243 0.00123
pool2 92511 0.00042
conv3 297117 0.00135
conv4 238363 0.00108
conv5 166485 0.00076
pool5 19504 0.00009
fc6 3955608 0.01798
fc7 1757867 0.00799
fc 117060 0.00053
* The clock frequency of the DL processor is: 220MHz
ans = 'corona'
label = 'corona'
