Запуск сетей только для свертки с помощью развертывания FPGA

Чтобы понять и отлажить сверточные сети, выполнение и визуализация данных является полезным инструментом. В этом примере показано, как развертывать, запускать и отлаживать сеть только для свертки с помощью развертывания 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 сети

ResNet-50 является сверточной нейронной сетью , которым имеет 50 слоёв глубины. Эта предварительно обученная сеть может классифицировать изображения по 1000 категориям объектов (таким как клавиатура, мышь, карандаш и многое другое). Эта сеть изучила представления богатых функций для широкой области значений изображений. Сеть имеет размер входного сигнала изображения 224 224.

Загрузка Resnet-50 сети

Загрузите ResNet-50 сеть.

rnet = resnet50;

Чтобы визуализировать структуру Resnet-50 сети, в командной строке MATLAB введите:

analyzeNetwork(rnet)

Создайте подмножество Resnet-50 сети

Чтобы изучить выходы 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 серии

Чтобы скомпилировать измененную сеть 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]

Программа Bitstream на FPGA и загрузка сетевых весов

Чтобы развернуть сеть на оборудовании 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)

Яркие функции указывают на сильную активацию. Чтобы понять и отлажить сверточные сети, выполнение и визуализация данных является полезным инструментом.