Типичные сети классификации рядов включают последовательность слоев свертки, сопровождаемых одним или несколькими полносвязными слоями. Недавние результаты исследования показывают, что лучшая эффективность достигается для извлечения признаков и распознавания при помощи активаций слоя свертки непосредственно вместо тех от последующих полносвязных слоев.
Изучать и отлаживать сверточные сети, запускаясь и визуализируя данные - полезный инструмент. В этом примере показано, как развернуться, запуститесь и отладьте сеть только для свертки при помощи развертывания 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. Этот пример использует ResNet50 в качестве начальной точки.
Загрузите сеть 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]
Чтобы развернуть сеть на оборудовании 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 функций. Яркие функции указывают на сильную активацию.
Выход от сверточных слоев только сеть отличается от той из сети со сверткой и полносвязными слоями. Слои свертки используются, чтобы уменьшать входной размер изображения при поддержании функций, которые необходимы, чтобы получить хорошее предсказание. Свертка только сети слоя используется, чтобы изучить извлечение признаков. Более ранние слои свертки используются, чтобы извлечь функции низкого уровня, такие как ребра, цвета, градиенты и так далее. Более поздние слои свертки используются, чтобы извлечь функции высокого уровня, такие как шаблоны, кривые, линии и так далее. Эти функции высокого уровня могут затем быть использованы, чтобы идентифицировать объекты.