Изучать и отлаживать сверточные сети, запускаясь и визуализируя данные - полезный tool.This пример, показывает, как развернуть, запустить и отлаживает сеть только для свертки при помощи развертывания FPGA.
Оценочный комплект Xilinx Zynq ZCU102
Пакет поддержки Deep Learning HDL Toolbox™ для FPGA Xilinx и SoC
Deep Learning Toolbox™
Deep Learning HDL Toolbox™
Модель Deep Learning Toolbox™ для сети Resnet-50
ResNet-50 является сверточной нейронной сетью, которая является 50 слоями глубоко. Эта предварительно обученная сеть может классифицировать изображения в 1 000 категорий объектов (таких как клавиатура, мышь, карандаш и другие).The сеть изучил богатые представления функции для широкого спектра изображений. Сеть имеет входной размер изображений 224 224.
Загрузите сеть ResNet-50.
rnet = resnet50;
Визуализировать структуру сети Resnet-50, в командной строке MATLAB, введите:
analyzeNetwork(rnet)
Исследовать выходные параметры max_pooling2d_1
слой, создайте эту сеть, которая является подмножеством сети ResNet-50:
layers = rnet.Layers(1:5); outLayer = regressionLayer('Name','output'); layers(end+1) = outLayer; snet = assembleNetwork(layers);
Создайте целевой объект с пользовательским именем и интерфейсом, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Набор Проекта Xilinx™ Vivado™ 2019.2. Установить Xilinx Vivado toolpath, введите:
%hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'D:/share/apps/HDLTools/Vivado/2019.2-mw-0/Win/Vivado/2019.2\bin\vivado.bat');
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');
Создайте объект dlhdl.Workflow
класс. Когда вы создаете объект, задаете сеть и имя потока битов. Укажите, что сохраненное предварительно обучило сеть подмножества ResNet-50, snet
, как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx. Поток битов использует один тип данных.
hW = dlhdl.Workflow('network', snet, 'Bitstream', 'zcu102_single','Target',hTarget);
Чтобы скомпилировать модифицированную сеть серии ResNet-50, запустите функцию компиляции dlhdl.Workflow
объект.
hW.compile
dn = hW.compile
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer' offset_name offset_address allocated_space _______________________ ______________ ________________ "InputDataOffset" "0x00000000" "24.0 MB" "OutputResultOffset" "0x01800000" "24.0 MB" "SystemBufferOffset" "0x03000000" "28.0 MB" "InstructionDataOffset" "0x04c00000" "4.0 MB" "ConvWeightDataOffset" "0x05000000" "4.0 MB" "EndOffset" "0x05400000" "Total: 84.0 MB"
dn = struct with fields:
Operators: [1×1 struct]
LayerConfigs: [1×1 struct]
NetConfigs: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZCU102, запустите развернуть функцию dlhdl.Workflow
объект. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть программы вычисления целевой функции устройство FPGA, сообщения о ходе выполнения отображений, и время это берет, чтобы развернуть сеть.
hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA.
Загрузите и отобразите изображение, чтобы использовать в качестве входного изображения к серийной сети.
I = imread('daisy.jpg');
imshow(I)
Выполните предсказать функцию dlhdl.Workflow
объект.
[P, speed] = hW.predict(single(I),'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 2813005 0.01279 1 2813015 78.2 conv_module 2813005 0.01279 conv1 2224168 0.01011 max_pooling2d_1 588864 0.00268 * The clock frequency of the DL processor is: 220MHz
Данные о результате возвращены как трехмерный массив с третьей индексацией размерности через 64 изображения функции.
sz = size(P)
sz = 1×3
56 56 64
Чтобы визуализировать все 64 функции в одном изображении, данные изменены в 4 размерности, который является соответствующим входом к imtile
функция
R = reshape(P, [sz(1) sz(2) 1 sz(3)]); sz = size(R)
sz = 1×4
56 56 1 64
Вход к imtile
нормирован с помощью mat2gray
. Все значения масштабируются так, чтобы минимальная активация была 0, и максимальная активация равняется 1.
J = imtile(mat2gray(R), 'GridSize', [8 8]);
Показать эти активации при помощи imtile
функционируйте, измените размерность массива к 4-D. Третья размерность во входе к imtile
представляет цвет изображения. Установите третью размерность измерять 1, потому что активации не имеют цвета. Четвертая размерность индексирует канал. Размер скрипа 8x8 выбран, потому что существует 64 функции, чтобы отобразиться.
imshow(J)
Яркие функции указывают на сильную активацию. Изучать и отлаживать сверточные сети, запускаясь и визуализируя данные - полезный инструмент.