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