В этом примере показано, как создать, скомпилируйте и разверните dlhdl.Workflow объект, который имеет рукописный символ detction ряд networkas сетевой объект с помощью Пакета поддержки Deep Learning HDL Toolbox™ для Xilinx® FPGA и SoC. Использование MATLAB®, чтобы получить предсказание следует из целевого устройства.
Xilinx® Zynq® ZC706 Evaluation Kit
Пакет поддержки Deep Learning HDL Toolbox™ для Xilinx® FPGA и SoC
Deep Learning Toolbox™
Deep Learning HDL Toolbox™
Загрузите предварительно обученную серийную сеть, обученную на базе данных Modified National Institute of Standards and Technology (MNIST).
snet = getDigitsNetwork;
Просмотрите слои предварительно обученной серийной сети, при помощи analyzeNetwork функция.
analyzeNetwork(snet)
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Набор Проекта Xilinx™ Vivado™ 2019.2. Установить Xilinx Vivado toolpath, введите:
% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2019.2\bin\vivado.bat');hTarget = dlhdl.Target('Xilinx');Создайте объект dlhdl.Workflow класс. Задайте сеть и имя потока битов. Укажите, что сохраненное предварительно обучило нейронную сеть MNIST, snet, как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой Xilinx Zynq ZC706. Поток битов использует один тип данных.
hW = dlhdl.Workflow('Network', snet, 'Bitstream', 'zc706_single','Target',hTarget);
Запустите функцию компиляции dlhdl.Workflow объект, чтобы скомпилировать сеть серии MNIST.
dn = hW.compile
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
offset_name offset_address allocated_space
_______________________ ______________ ________________
"InputDataOffset" "0x00000000" "4.0 MB"
"OutputResultOffset" "0x00400000" "4.0 MB"
"SystemBufferOffset" "0x00800000" "28.0 MB"
"InstructionDataOffset" "0x02400000" "4.0 MB"
"ConvWeightDataOffset" "0x02800000" "4.0 MB"
"FCWeightDataOffset" "0x02c00000" "4.0 MB"
"EndOffset" "0x03000000" "Total: 48.0 MB"
dn = struct with fields:
Operators: [1×1 struct]
LayerConfigs: [1×1 struct]
NetConfigs: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZC706, запустите развернуть функцию dlhdl.Workflow объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть функция начинает программировать устройство FPGA и отображает сообщения о ходе выполнения и время, которое требуется, чтобы развернуть сеть.
hW.deploy
### Programming FPGA Bitstream using JTAG... ### Programming the FPGA bitstream has been completed successfully. ### Loading weights to FC Processor. ### FC Weights loaded. Current time is 12-Jun-2020 14:54:22
Загрузите изображение в качестве примера.
inputImg = imread('five_28x28.pgm');
imshow(inputImg);
Выполните предсказать функцию dlhdl.Workflow object и отобразите результат предсказания и производительность сети.
[prediction, speed] = hW.predict(single(inputImg),'Profile','on');
### Finished writing input activations.
### Running single input activations.
Deep Learning Processor Profiler Performance Results
LastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s
------------- ------------- --------- --------- ---------
Network 80141 0.00160 1 80182 623.6
conv_module 47601 0.00095
conv_1 10047 0.00020
maxpool_1 6999 0.00014
conv_2 11367 0.00023
maxpool_2 5465 0.00011
conv_3 13783 0.00028
fc_module 32540 0.00065
fc 32540 0.00065
* The clock frequency of the DL processor is: 50MHz
[val, idx] = max(prediction);
fprintf('The prediction result is %d\n', idx-1);The prediction result is 5