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

Типичные сети классификации рядов включают последовательность слоев свертки, сопровождаемых одним или несколькими полносвязными слоями. Недавние результаты исследования показывают, что лучшая эффективность достигается для извлечения признаков и распознавания при помощи активаций слоя свертки непосредственно вместо тех от последующих полносвязных слоев.

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

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

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

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

rnet = resnet50;

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

analyzeNetwork(rnet)

Создайте свертку только сеть

Свертка только сеть создается путем выбора подмножества сети ResNet-50. Подмножество включает только первые пять слоев сети ResNet50, которые являются сверточными по своей природе.

Создать свертку только сеть, введите:

layers = rnet.Layers(1:5);
outLayer = regressionLayer('Name','output');
layers(end+1) = outLayer;

snet = assembleNetwork(layers);

Создайте целевой объект

Чтобы развернуть сеть на FPGA, создайте целевой объект с пользовательским именем и интерфейсом, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются 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 класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте сохраненное предварительно обученное сверточное только сеть, snet, как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx. Поток битов использует один тип данных. Используйте dlhdl.Workflow объект развернуть сети, которые включают и свертку и полносвязные слоя или только слои свертки.

hW = dlhdl.Workflow('Network', snet, 'Bitstream', 'zcu102_single','Target',hTarget);

Скомпилируйте свертку только сеть

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

Поток битов программы на 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 функции в одном изображении, данные изменены в четыре размерности, который является соответствующим входом к imtile функция

R = reshape(P, [sz(1) sz(2) 1 sz(3)]);
sz = size(R)
sz = 1×4

    56    56     1    64

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

Вход к imtile нормирован с помощью mat2gray. Все значения масштабируются так, чтобы минимальная активация была 0, и максимальная активация равняется 1.

J = imtile(mat2gray(R), 'GridSize', [8 8]);

Размер сетки 8 8 выбран, потому что существует 64 функции, чтобы отобразиться.

imshow(J)

Изображение показывает данные об активации для каждой из 64 функций. Яркие функции указывают на сильную активацию.

Выход от сверточных слоев только сеть отличается от той из сети со сверткой и полносвязными слоями. Слои свертки используются, чтобы уменьшать входной размер изображения при поддержании функций, которые необходимы, чтобы получить хорошее предсказание. Свертка только сети слоя используется, чтобы изучить извлечение признаков. Более ранние слои свертки используются, чтобы извлечь функции низкого уровня, такие как ребра, цвета, градиенты и так далее. Более поздние слои свертки используются, чтобы извлечь функции высокого уровня, такие как шаблоны, кривые, линии и так далее. Эти функции высокого уровня могут затем быть использованы, чтобы идентифицировать объекты.