Для понимания и отладки сверточных сетей использование и визуализация данных является полезным инструментом. В этом примере показано, как развернуть, запустить и отладить сеть только для свертки с помощью развертывания FPGA.
Оценочный комплект Xilinx Zynq ZCU102
Пакет поддержки HDL Toolbox™ глубокого обучения для Xilinx FPGA и SoC
Глубокое обучение Toolbox™
Глубокое обучение HDL Toolbox™
Модель Toolbox™ глубокого обучения для сети Resnet-50
ResNet-50 - сверточная нейронная сеть глубиной 50 слоев. Эта предварительно обученная сеть может классифицировать изображения по 1000 категориям объектов (например, клавиатура, мышь, карандаш и т. д.). Сеть имеет размер входного изображения 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™ Design Suite 2019.2. Чтобы задать траекторию инструмента Xilinx Vivado, введите:
%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 является плата Xilinx ZCU102 SOC. Битовый поток использует один тип данных.
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
Результирующие данные возвращаются в виде массива 3-D с индексацией третьего измерения по 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)

Яркие черты указывают на сильную активацию. Для понимания и отладки сверточных сетей использование и визуализация данных является полезным инструментом.