В этом примере показано, как обучать, компилировать и развертывать dlhdl.Workflow объект, который квантовал Alexnet в качестве сетевого объекта с помощью пакета поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC. Квантование помогает уменьшить потребность в памяти глубокой нейронной сети за счет квантования весов, смещений и активизаций сетевых уровней до 8-битных масштабированных целочисленных типов данных. Используйте MATLAB ® для извлечения результатов прогнозирования из целевого устройства .
Для этого примера необходимо:
Инструментарий для глубокого обучения ™
Набор инструментов для глубокого обучения ЛПВП ™
Библиотека квантования модели набора инструментов для глубокого обучения
Пакет поддержки панели инструментов глубокого обучения HDL для устройств Xilinx FPGA и SoC
Интерфейс кодера MATLAB для библиотек глубокого обучения.
Для загрузки предварительно обученной сети серии AlexNet введите:
snet = alexnet;
Для просмотра уровней предварительно обученной сети серии введите:
analyzeNetwork(snet);
Первый слой, изображение ввело слой, требует входных изображений размера 227 на 227 на 3, где 3 количество цветных каналов.
inputSize = snet.Layers(1).InputSize;
inputSize = 1×3
227 227 3
В этом примере используется 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 сконфигурированы для 1000 классов. Эти три уровня должны быть точно настроены для новой задачи классификации. Извлеките все слои, за исключением последних трех, из предварительно подготовленной сети.
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, но изображения в хранилищах данных изображений имеют разные размеры. Используйте хранилище данных дополненного изображения для автоматического изменения размеров обучающих изображений. Укажите дополнительные операции увеличения, выполняемые с обучающими изображениями, такие как случайное переворачивание обучающих изображений вдоль вертикальной оси и их случайное перемещение до 30 пикселей по горизонтали и вертикали. Увеличение объема данных помогает предотвратить переоборудование сети и запоминание точных деталей обучающих изображений.
pixelRange = [-30 30]; imageAugmenter = imageDataAugmenter( ... 'RandXReflection',true, ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange); 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 использует графический процессор, если он доступен (требуется параллельное вычисление Toolbox™ и поддерживаемое устройство графического процессора. Дополнительные сведения см. в разделе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений)). В противном случае сеть использует CPU (требуется интерфейс кодера MATLAB для 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™ Design Suite 2020.1. Чтобы задать траекторию инструмента Xilinx Vivado, введите:
% 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 является плата Xilinx ZCU102 SOC, а битовый поток использует тип данных 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'
