Чтобы понять и отлажить сверточные сети, выполнение и визуализация данных является полезным инструментом. В этом примере показано, как развертывать, запускать и отлаживать сеть только для свертки с помощью развертывания FPGA.
Набор для оценки ZCU102 Xilinx Zynq
Пакет поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC
Deep Learning Toolbox™
Deep Learning HDL Toolbox™
Модель Deep Learning 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
Результат данных возвращается как трехмерный массив с третьей размерности индексацией по 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
function, измените форму массива на 4-D. Третья размерность во входе для imtile
представляет цвет изображения. Установите третью размерность 1, поскольку активация не имеет цвета. Четвертая размерность индексирует канал. Размер сетки 8x8 выбран из-за 64 отображаемых функций.
imshow(J)
Яркие функции указывают на сильную активацию. Чтобы понять и отлажить сверточные сети, выполнение и визуализация данных является полезным инструментом.