В этом примере показано, как создать, скомпилируйте и разверните 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