В этом примере показано, как обучить, скомпилировать и развернуть dlhdl.Workflow
объект, квантовавший Alexnet как сетевой объект с помощью пакета поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC. Квантование помогает уменьшить потребность глубокой нейронной сети в памяти путем квантования весов, смещений и активаций слоев сети до 8-битных масштабированных целочисленных типов данных. Используйте MATLAB ®, чтобы получить результаты предсказания с целевого устройства .
В данном примере вам нужно:
Набор инструментов Deep Learning Toolbox ™
Deep Learning HDL Toolbox ™
Библиотека квантования модели Deep Learning Toolbox
Пакет поддержки пакета Deep Learning HDL Toolbox для устройств Xilinx FPGA и SoC
Интерфейс MATLAB Coder для библиотек глубокого обучения.
Чтобы загрузить предварительно обученную сеть серии AlexNet, введите:
snet = alexnet;
Чтобы просмотреть слои предварительно обученной последовательной сети, введите:
analyzeNetwork(snet);
Первый слой, входной слой для изображений, требует входа изображений размера 227 227 3, где 3 количество цветовых каналов.
inputSize = snet.Layers(1).InputSize;
inputSize =
1×3
227 227 3
Этот пример использует logos_dataset
набор данных. Набор данных состоит из 320 изображений. Создайте augmentedImageDatastore
объект, используемый для обучения и валидации.
curDir = pwd; newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip'); copyfile(newDir,curDir,'f'); unzip('logos_dataset.zip'); imds = imageDatastore('logos_dataset', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Последние три слоя предварительно обученной сети net
настроены для 1000 классов. Эти три слоя должны быть уточнены для новой задачи классификации. Извлеките все слои, кроме последних трех слоев, из предварительно обученной сети.
layersTransfer = snet.Layers(1:end-3);
Перенесите слои в новую задачу классификации путем замены последних трех слоев полносвязным слоем, слоем softmax и выходным слоем классификации. Установите для полностью подключенного слоя тот же размер, что и для количества классов в новых данных.
numClasses = numel(categories(imdsTrain.Labels));
numClasses = 32
layers = [ layersTransfer fullyConnectedLayer(numClasses,'WeightLearnRateFactor',20,'BiasLearnRateFactor',20) softmaxLayer classificationLayer];
Сеть требует входа изображений размера 227 227 3, но изображения в хранилищах данных изображений имеют различные размеры. Используйте хранилище данных дополненных изображений, чтобы автоматически изменить размер обучающих изображений. Задайте дополнительные операции увеличения для выполнения обучающих изображений, такие как случайное листание обучающих изображений вдоль вертикальной оси и случайное перемещение их до 30 пикселей горизонтально и вертикально. Увеличение количества данных помогает предотвратить сверхподбор кривой сети и запоминание точных деталей обучающих изображений.
pixelRange = [-30 30]; imageAugmenter = imageDataAugmenter( ... 'RandXReflection',true, ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange); augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ... 'DataAugmentation',imageAugmenter);
Чтобы автоматически изменить размер изображений валидации, не выполняя дальнейшего увеличения данных, используйте хранилище datastore с дополненными изображениями, не задавая никаких дополнительных операций предварительной обработки.
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);
Задайте опции обучения. Для передачи обучения сохраните функции из ранних слоев предварительно обученной сети (веса переданных слоев). Чтобы замедлить обучение в перенесенных слоях, установите начальную скорость обучения на небольшое значение. Укажите размер мини-пакета и данные валидации. Программное обеспечение проверяет сеть каждый ValidationFrequency
итерации во время обучения.
options = trainingOptions('sgdm', ... 'MiniBatchSize',10, ... 'MaxEpochs',6, ... 'InitialLearnRate',1e-4, ... 'Shuffle','every-epoch', ... 'ValidationData',augimdsValidation, ... 'ValidationFrequency',3, ... 'Verbose',false, ... 'Plots','training-progress');
Обучите сеть, которая состоит из переданного и нового слоев. По умолчанию trainNetwork
использует графический процессор, если он доступен (требует Parallel Computing Toolbox™ и поддерживаемое устройство GPU. Для получения дополнительной информации смотрите Поддержку GPU by Release (Parallel Computing Toolbox)). В противном случае в сети используется центральный процессор (для глубокого обучения требуется MATLAB Coder Interface Libraries™). Можно также задать окружение выполнения с помощью 'ExecutionEnvironment'
аргумент имя-значение trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,layers,options);
dlquantizer
ОбъектСоздайте dlquantizer
объект и укажите сеть для квантования. Укажите окружение выполнения как FPGA.
dlQuantObj = dlquantizer(netTransfer,'ExecutionEnvironment','FPGA');
The dlquantizer
объект использует калибровочные данные для сбора динамических областей значений для настраиваемых параметров свертки и полносвязных слоев сети.
Для наилучших результатов квантования данные калибровки должны быть показательными из фактических входов, предсказанных сетью LogoNet. Ускорите процесс калибровки, уменьшив набор данных калибровки до 20 изображений.
imageData = imageDatastore(fullfile(curDir,'logos_dataset'),... 'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames'); imageData_reduced = imageData.subset(1:20); dlQuantObj.calibrate(imageData_reduced)
Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейсом, чтобы подключить ваше целевое устройство к хосту-компьютеру. Опции интерфейса JTAG и Ethernet. Чтобы использовать JTAG, установите Xilinx™ Vivado™ Design Suite 2020.1. Чтобы задать траекторию инструмента Xilinx Vivado, введите:
% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.1\bin\vivado.bat');
Чтобы создать целевой объект, введите:
hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');
Также можно использовать интерфейс JTAG.
% hTarget = dlhdl.Target('Xilinx', 'Interface', 'JTAG');
Создайте объект dlhdl.Workflow
класс. При создании класса задается образец объекта dlquantizer, имя битового потока и целевая информация. Задайте dlQuantObj
как сеть. Убедитесь, что имя битового потока соответствует типу данных и плате FPGA, на которую вы нацелены. В этом примере целевой платой FPGA является плата Xilinx ZCU102 SOC, а в битовом потоке используется тип данных int8.
hW = dlhdl.Workflow('Network', dlQuantObj, 'Bitstream', 'zcu102_int8','Target',hTarget);
Чтобы скомпилировать квантованную сеть серии AlexNet, запустите функцию компиляции dlhdl.Workflow
объект.
dn = hW.compile
### Compiling network for Deep Learning FPGA prototyping ... ### Targeting FPGA bitstream zcu102_int8 ... ### The network includes the following layers: 1 'data' Image Input 227×227×3 images with 'zerocenter' normalization (SW Layer) 2 'conv1' Convolution 96 11×11×3 convolutions with stride [4 4] and padding [0 0 0 0] (HW Layer) 3 'relu1' ReLU ReLU (HW Layer) 4 'norm1' Cross Channel Normalization cross channel normalization with 5 channels per element (HW Layer) 5 'pool1' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 6 'conv2' Grouped Convolution 2 groups of 128 5×5×48 convolutions with stride [1 1] and padding [2 2 2 2] (HW Layer) 7 'relu2' ReLU ReLU (HW Layer) 8 'norm2' Cross Channel Normalization cross channel normalization with 5 channels per element (HW Layer) 9 'pool2' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 10 'conv3' Convolution 384 3×3×256 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer) 11 'relu3' ReLU ReLU (HW Layer) 12 'conv4' Grouped Convolution 2 groups of 192 3×3×192 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer) 13 'relu4' ReLU ReLU (HW Layer) 14 'conv5' Grouped Convolution 2 groups of 128 3×3×192 convolutions with stride [1 1] and padding [1 1 1 1] (HW Layer) 15 'relu5' ReLU ReLU (HW Layer) 16 'pool5' Max Pooling 3×3 max pooling with stride [2 2] and padding [0 0 0 0] (HW Layer) 17 'fc6' Fully Connected 4096 fully connected layer (HW Layer) 18 'relu6' ReLU ReLU (HW Layer) 19 'drop6' Dropout 50% dropout (HW Layer) 20 'fc7' Fully Connected 4096 fully connected layer (HW Layer) 21 'relu7' ReLU ReLU (HW Layer) 22 'drop7' Dropout 50% dropout (HW Layer) 23 'fc' Fully Connected 32 fully connected layer (HW Layer) 24 'softmax' Softmax softmax (SW Layer) 25 'classoutput' Classification Output crossentropyex with 'adidas' and 31 other classes (SW Layer) 3 Memory Regions created. Skipping: data Compiling leg: conv1>>pool5 ... Compiling leg: conv1>>pool5 ... complete. Compiling leg: fc6>>fc ... Compiling leg: fc6>>fc ... complete. Skipping: softmax Skipping: classoutput Creating Schedule... ......... Creating Schedule...complete. Creating Status Table... ........ Creating Status Table...complete. Emitting Schedule... ...... Emitting Schedule...complete. Emitting Status Table... .......... Emitting Status Table...complete. ### Allocating external memory buffers: offset_name offset_address allocated_space _______________________ ______________ _________________ "InputDataOffset" "0x00000000" "48.0 MB" "OutputResultOffset" "0x03000000" "4.0 MB" "SchedulerDataOffset" "0x03400000" "4.0 MB" "SystemBufferOffset" "0x03800000" "28.0 MB" "InstructionDataOffset" "0x05400000" "4.0 MB" "ConvWeightDataOffset" "0x05800000" "8.0 MB" "FCWeightDataOffset" "0x06000000" "56.0 MB" "EndOffset" "0x09800000" "Total: 152.0 MB" ### Network compilation complete.
dn = struct with fields:
weights: [1×1 struct]
instructions: [1×1 struct]
registers: [1×1 struct]
syncInstructions: [1×1 struct]
Чтобы развернуть сеть на оборудовании Xilinx ZCU102 SoC, запустите функцию развертывания dlhdl.Workflow
объект. Эта функция использует выход функции компиляции, чтобы запрограммировать плату FPGA с помощью файла программирования. Он также загружает веса и смещения сети. Функция развертывания начинает программировать устройство FPGA, отображает сообщения о прогрессе и времени развертывания сети.
hW.deploy
### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA. ### Loading weights to Conv Processor. ### Conv Weights loaded. Current time is 17-Dec-2020 11:06:56 ### Loading weights to FC Processor. ### 33% finished, current time is 17-Dec-2020 11:06:57. ### 67% finished, current time is 17-Dec-2020 11:06:59. ### FC Weights loaded. Current time is 17-Dec-2020 11:06:59
Чтобы загрузить изображение примера, выполните predict
функция dlhdl.Workflow
объект, а затем отобразить результат FPGA, введите:
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 Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 9088267 0.04131 1 9088267 24.2 conv1 713071 0.00324 norm1 460546 0.00209 pool1 88791 0.00040 conv2 911059 0.00414 norm2 270230 0.00123 pool2 92782 0.00042 conv3 297066 0.00135 conv4 238155 0.00108 conv5 166248 0.00076 pool5 19576 0.00009 fc6 3955696 0.01798 fc7 1757863 0.00799 fc 117059 0.00053 * The clock frequency of the DL processor is: 220MHz
ans = 'ford'
label = 'ford'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 9088122 0.04131 1 9088122 24.2 conv1 713003 0.00324 norm1 460513 0.00209 pool1 89083 0.00040 conv2 910726 0.00414 norm2 270238 0.00123 pool2 92773 0.00042 conv3 297151 0.00135 conv4 238132 0.00108 conv5 166415 0.00076 pool5 19561 0.00009 fc6 3955517 0.01798 fc7 1757860 0.00799 fc 117054 0.00053 * The clock frequency of the DL processor is: 220MHz
ans = 'bmw'
label = 'bmw'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 9088305 0.04131 1 9088305 24.2 conv1 713031 0.00324 norm1 460263 0.00209 pool1 88948 0.00040 conv2 911216 0.00414 norm2 270247 0.00123 pool2 92514 0.00042 conv3 297124 0.00135 conv4 238252 0.00108 conv5 166320 0.00076 pool5 19519 0.00009 fc6 3955853 0.01798 fc7 1757867 0.00799 fc 117055 0.00053 * The clock frequency of the DL processor is: 220MHz
ans = 'aldi'
label = 'aldi'
### Finished writing input activations. ### Running single input activations. Deep Learning Processor Profiler Performance Results LastFrameLatency(cycles) LastFrameLatency(seconds) FramesNum Total Latency Frames/s ------------- ------------- --------- --------- --------- Network 9088168 0.04131 1 9088168 24.2 conv1 713087 0.00324 norm1 460226 0.00209 pool1 89136 0.00041 conv2 910865 0.00414 norm2 270243 0.00123 pool2 92511 0.00042 conv3 297117 0.00135 conv4 238363 0.00108 conv5 166485 0.00076 pool5 19504 0.00009 fc6 3955608 0.01798 fc7 1757867 0.00799 fc 117060 0.00053 * The clock frequency of the DL processor is: 220MHz
ans = 'corona'
label = 'corona'