В этом примере показано, как обучаться, скомпилируйте и развернитесь, модифицированный квантованный AlexNet предварительно обучил серийную сеть при помощи Пакета Поддержки Deep Learning HDL Toolbox™ для FPGA Xilinx и SoC. Квантование помогает уменьшать требования к памяти глубокой нейронной сети путем квантования весов, смещений и активаций слоев сети к 8-битным масштабированным целочисленным типам данных. Использование MATLAB®, чтобы получить предсказание следует из целевого устройства.
Чтобы запустить этот пример, вам нужны продукты, перечисленные под FPGA
в необходимых условиях рабочего процесса квантования.
Создайте модифицированную серийную сеть при помощи передачи обучения. Для получения дополнительной информации смотрите, Создают Серийную Сеть для Квантования.
Создайте dlquantizer
возразите и задайте сеть, чтобы квантовать и ExecutionEnvironment
. netTransfer
сетью является выход модифицированной сети, созданной, переводом учась. Создать netTransfer
серийная сеть, смотрите, Создают Серийную Сеть для Квантования.
dlQuantObj = dlquantizer(netTransfer,'ExecutionEnvironment','FPGA');
Разархивируйте и загрузите новые изображения как datastore изображений. imageDatastore
автоматически помечает изображения на основе имен папок и хранит данные как ImageDatastore
объект. Datastore изображений позволяет вам сохранить большие данные изображения, включая данные, которые не умещаются в памяти, и эффективно считать пакеты изображений во время обучения сверточной нейронной сети.
Разделите данные на наборы данных обучения и валидации. Используйте 70% изображений для обучения и 30% для валидации. splitEachLabel
разделяет images
datastore в два новых хранилища данных.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir); unzip('logos_dataset.zip'); unzip('logos_dataset.zip'); imds = imageDatastore('logos_dataset', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Используйте calibrate
функционируйте, чтобы запустить сеть с демонстрационными входными параметрами и собрать информацию области значений. calibrate
функционируйте осуществляет сеть и собирает динамические диапазоны весов и смещений в свертке и полносвязных слоях сети и динамические диапазоны активаций во всех слоях сети. Функция возвращает таблицу. Каждая строка таблицы содержит информацию об области значений для настраиваемого параметра оптимизированной сети. Для лучших результатов квантования калибровочные данные должны быть представителем фактических входных параметров, которые были бы предсказаны сетью.
imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); dlQuantObj.calibrate(imageData);
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Создать целевой объект, введите:
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet','IPAddress','192.168.1.101');
Создайте объект dlhdl.Workflow
класс. Когда вы создаете объект, задаете сеть и имя потока битов. Задайте dlQuantObj
как сеть. Убедитесь, что имя потока битов совпадает с типом данных и платой FPGA, для которой вы предназначаетесь. В этом примере целевая плата FPGA является платой ZCU102 SOC Xilinx. Поток битов использует int8 тип данных.
hW = dlhdl.Workflow('network', dlQuantObj, 'Bitstream', 'zcu102_int8','Target',hTarget);
Скомпилируйте квантованную серийную сеть.
dn = hW.compile
offset_name offset_address allocated_space "InputDataOffset" "0x00000000" "48.0 MB" "OutputResultOffset" "0x03000000" "4.0 MB" "SystemBufferOffset" "0x03400000" "28.0 MB" "InstructionDataOffset" "0x05000000" "4.0 MB" "ConvWeightDataOffset" "0x05400000" "4.0 MB" "FCWeightDataOffset" "0x05800000" "56.0 MB" "EndOffset" "0x09000000" "Total: 144.0 MB" dn = struct with fields: Operators: [1×1 struct] LayerConfigs: [1×1 struct] NetConfigs: [1×1 struct]
Запустите развернуть функцию dlhdl.Workflow
объект развернуть сеть на оборудовании Xilinx ZCU102 SoC. Эта функция использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. Развернуть функция начинает программировать устройство FPGA, сообщения о ходе выполнения отображений, и время, которое требуется, чтобы развернуть сеть.
hW.deploy
Загрузите изображения в качестве примера и получите результаты предсказания.
idx = randperm(numel(imdsValidation.Files),4); figure for i = 1:4 subplot(2,2,i) I = readimage(imdsValidation,idx(i)); imshow(I) [prediction, speed] = hW.predict(single(I),'Profile','on'); [val, index] = max(prediction); netTransfer.Layers(end).ClassNames{index} label = netTransfer.Layers(end).ClassNames{index} title(string(label)); end
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance ResultsLastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 7615557 0.05077 1 7616123 19.7 conv_module 3123657 0.02082 conv1 733903 0.00489 norm1 485953 0.00324 pool1 108979 0.00073 conv2 631639 0.00421 norm2 289646 0.00193 pool2 115286 0.00077 conv3 307112 0.00205 conv4 249627 0.00166 conv5 176223 0.00117 pool5 25404 0.00017 fc_module 4491900 0.02995 fc6 3083885 0.02056 fc7 1370258 0.00914 fc 37755 0.00025 * The clock frequency of the DL processor is: 150MHz ans = 'carlsberg'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance ResultsLastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 7615364 0.05077 1 7615905 19.7 conv_module 3123385 0.02082 conv1 733946 0.00489 norm1 485695 0.00324 pool1 108971 0.00073 conv2 631616 0.00421 norm2 289612 0.00193 pool2 115363 0.00077 conv3 307034 0.00205 conv4 249683 0.00166 conv5 176216 0.00117 pool5 25364 0.00017 fc_module 4491979 0.02995 fc6 3083961 0.02056 fc7 1370258 0.00914 fc 37758 0.00025 * The clock frequency of the DL processor is: 150MHz ans = 'pepsi'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance ResultsLastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 7615042 0.05077 1 7615582 19.7 conv_module 3123107 0.02082 conv1 733949 0.00489 norm1 485783 0.00324 pool1 108565 0.00072 conv2 631567 0.00421 norm2 289568 0.00193 pool2 115037 0.00077 conv3 307355 0.00205 conv4 249793 0.00167 conv5 176217 0.00117 pool5 25388 0.00017 fc_module 4491935 0.02995 fc6 3083920 0.02056 fc7 1370258 0.00914 fc 37755 0.00025 * The clock frequency of the DL processor is: 150MHz ans = 'tsingtao'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance ResultsLastLayerLatency(cycles) LastLayerLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 7615303 0.05077 1 7615843 19.7 conv_module 3123324 0.02082 conv1 733883 0.00489 norm1 485688 0.00324 pool1 108995 0.00073 conv2 631598 0.00421 norm2 289636 0.00193 pool2 115351 0.00077 conv3 307108 0.00205 conv4 249623 0.00166 conv5 176193 0.00117 pool5 25364 0.00017 fc_module 4491979 0.02995 fc6 3083961 0.02056 fc7 1370258 0.00914 fc 37758 0.00025 * The clock frequency of the DL processor is: 150MHz ans = 'singha'