Класс: dlhdl.Simulator
Пакет: dlhdl
Получите результаты предсказания для dlhdl.Simulator
объект
prediction = predict(image)
возвращает таблицу, содержащую значения предсказания процента для входного изображения, заданного prediction
= predict(image
)image
.
image
— Введите изображениеВведите изображение в виде m-by-n-by-k числовой массив. m, n и k должны совпадать с размерностями входного слоя изображения нейронной сети для глубокого обучения. Например, для сети LogoNet, измените размер входных изображений к 227 227 3 массивами.
Типы данных: single
prediction
— Сетевое предсказание для входного изображенияtable
Предсказание нейронной сети для глубокого обучения для входного изображения задано image
.
Быстрое прототипирование ваша пользовательская нейронная сеть для глубокого обучения и поток битов путем визуализации промежуточной активации слоя заканчивается и проверки точности предсказания без целевого компьютера путем эмуляции сети и потока битов. Чтобы эмулировать сеть и передать поток битов, создайте dlhdl.Simulator
объект. Используйте dlhdl.Simulator
объект к:
Получите промежуточные результаты слоя при помощи activations
функция.
Проверьте точность предсказания при помощи predict
функция.
В этом примере получите промежуточные результаты активации слоя и проверьте точность предсказания для сети ResNet-18 и настройку процессора глубокого обучения для zcu102_single
поток битов.
Необходимые условия
Deep Learning Toolbox ™
Deep Learning HDL Toolbox ™
Модель Deep Learning Toolbox для сети ResNet-18
Пакет поддержки Deep Learning HDL Toolbox для FPGA Xilinx и устройств SoC
Image Processing Toolbox ™
Интерфейс MATLAB Coder для Глубокого обучения Libraries™
Загрузите предварительно обученный SeriesNetwork
Загружать предварительно обученную сеть ResNet-18, введите:
snet = resnet18;
Просмотреть слои предварительно обученной сети, введите:
analyzeNetwork(snet);
Первый слой, изображение ввело слой, требует входных изображений размера 224 224 3, где 3 количество цветовых каналов.
inputSize = snet.Layers(1).InputSize;
Задайте наборы данных обучения и валидации
Этот пример использует MathWorks
Набор данных MerchData. Это - небольшой набор данных, содержащий 75 изображений товаров MathWorks, принадлежа пяти различным классам (дно, куб, игра в карты, отвертка и факел).
curDir = pwd; unzip('MerchData.zip'); imds = imageDatastore('MerchData', ... 'IncludeSubfolders',true, ... 'LabelSource','foldernames'); [imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomized');
Замените последние слои
Полносвязный слой и слой классификации предварительно обученной сети net
сконфигурированы для 1 000 классов. Эти два слоя fc1000
и ClassificationLayer_predictions
в ResNet-18 содержат информацию о том, как сочетать функции, которые сеть извлекает в вероятности класса и предсказанные метки. Эти слои должны быть подстроены для новой проблемы классификации. Извлеките все слои, кроме последних двух слоев, от предварительно обученной сети.
lgraph = layerGraph(snet)
lgraph = LayerGraph with properties: Layers: [71×1 nnet.cnn.layer.Layer] Connections: [78×2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_predictions'}
numClasses = numel(categories(imdsTrain.Labels))
numClasses = 5
newLearnableLayer = fullyConnectedLayer(numClasses, ... 'Name','new_fc', ... 'WeightLearnRateFactor',10, ... 'BiasLearnRateFactor',10); lgraph = replaceLayer(lgraph,'fc1000',newLearnableLayer); newClassLayer = classificationLayer('Name','new_classoutput'); lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);
Обучение сети
Сеть требует входных изображений размера 224 224 3, но изображения в хранилищах данных изображений имеют различные размеры. Используйте увеличенный datastore изображений, чтобы автоматически изменить размер учебных изображений. Задайте дополнительные операции увеличения, чтобы выполнить на учебных изображениях, таких как случайное зеркальное отражение учебных изображений вдоль вертикальной оси и случайным образом перевода их до 30 пикселей горизонтально и вертикально. Увеличение данных помогает препятствовать тому, чтобы сеть сверхсоответствовала и запомнила точные детали учебных изображений.
pixelRange = [-30 30]; imageAugmenter = imageDataAugmenter( ... 'RandXReflection',true, ... 'RandXTranslation',pixelRange, ... 'RandYTranslation',pixelRange);
Чтобы автоматически изменить размер изображений валидации, не выполняя дальнейшее увеличение данных, используйте увеличенный datastore изображений, не задавая дополнительных операций предварительной обработки.
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain, ... 'DataAugmentation',imageAugmenter); 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™ и поддерживаемого устройства графического процессора. Смотрите Поддержку графического процессора Релизом (Parallel Computing Toolbox)). В противном случае сеть использует центральный процессор (требует Интерфейса MATLAB Coder для Глубокого обучения Libraries™). Можно также задать среду выполнения при помощи 'ExecutionEnvironment'
аргумент значения имени trainingOptions
.
netTransfer = trainNetwork(augimdsTrain,lgraph,options);
Получите настройку процессора глубокого обучения
Используйте dlhdl.ProcessorConfig
объект получить настройку процессора глубокого обучения для zcu102_single
поток битов.
hPC = dlhdl.ProcessorConfig('Bitstream','zcu102_single');
Создайте объект средства моделирования
Создайте dlhdl.Simulator
объект с ResNet-18 как сеть и hPC
как ProcessorConfig
объект.
simObj = dlhdl.Simulator('Network',netTransfer,'ProcessorConfig',hPC);
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer' ### Notice: The layer 'data' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'out_data' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv1>>pool1 ... ### Notice: The layer 'data' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: conv1>>pool1 ... complete. Compiling leg: res2a_branch2a>>res2a_branch2b ... ### Notice: The layer 'pool1' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res2a_branch2a>>res2a_branch2b ... complete. Compiling leg: res2b_branch2a>>res2b_branch2b ... ### Notice: The layer 'res2a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res2b_branch2a>>res2b_branch2b ... complete. Compiling leg: res3a_branch1 ... ### Notice: The layer 'res2b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3a_branch1 ... complete. Compiling leg: res3a_branch2a>>res3a_branch2b ... ### Notice: The layer 'res2b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3a_branch2a>>res3a_branch2b ... complete. Compiling leg: res3b_branch2a>>res3b_branch2b ... ### Notice: The layer 'res3a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res3b_branch2a>>res3b_branch2b ... complete. Compiling leg: res4a_branch1 ... ### Notice: The layer 'res3b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4a_branch1 ... complete. Compiling leg: res4a_branch2a>>res4a_branch2b ... ### Notice: The layer 'res3b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4a_branch2a>>res4a_branch2b ... complete. Compiling leg: res4b_branch2a>>res4b_branch2b ... ### Notice: The layer 'res4a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res4b_branch2a>>res4b_branch2b ... complete. Compiling leg: res5a_branch1 ... ### Notice: The layer 'res4b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5a_branch1 ... complete. Compiling leg: res5a_branch2a>>res5a_branch2b ... ### Notice: The layer 'res4b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5a_branch2a>>res5a_branch2b ... complete. Compiling leg: res5b_branch2a>>res5b_branch2b ... ### Notice: The layer 'res5a_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: res5b_branch2a>>res5b_branch2b ... complete. Compiling leg: pool5 ... ### Notice: The layer 'res5b_relu' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: pool5 ... complete. Compiling leg: new_fc ... ### Notice: The layer 'pool5' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software. Compiling leg: new_fc ... complete. ### Should not enter here. It means a component is unaccounted for in MATLAB Emulation. ### Notice: The layer 'new_fc' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software. ### Notice: The layer 'prob' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software. ### Notice: The layer 'new_classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
Загрузите изображение для предсказания и промежуточных результатов активации слоя
Загрузите изображение в качестве примера. Сохраните это - размер для будущего использования.
imgFile = fullfile(pwd,'MerchData','MathWorks Cube','Mathworks cube_0.jpg'); inputImg = imresize(imread(imgFile),inputSize(1:2)); imshow(inputImg)
Покажите активации первого слоя Maxpool
Исследуйте функции путем наблюдения, какие области в слоях свертки активируются на изображении. Сравните то изображение с соответствующими областями в оригинальных изображениях. Каждый слой сверточной нейронной сети состоит из названных каналов многих 2D массивов. Передайте изображение через сеть и исследуйте выходные активации pool1
слой.
act1 = simObj.activations(single(inputImg),'pool1');
Активации возвращены как трехмерный массив с третьей размерностью, индексирующей канал на pool1
слой. Показать эти активации при помощи imtile
функционируйте, измените размерность массива к 4-D. Третья размерность во входе к imtile
представляет цвет изображения. Установите третью размерность иметь размер 1, потому что активации не имеют цвета. Четвертая размерность индексирует канал.
sz = size(act1); act1 = reshape(act1,[sz(1) sz(2) 1 sz(3)]);
Отобразите активации. Каждая активация может принять любое значение, поэтому нормировать выход при помощи mat2gray
. Все активации масштабируются так, чтобы минимальная активация была 0, и максимальная активация равняется 1. Отобразите 64 изображения на 8 8 сетка, один для каждого канала в слое.
I = imtile(mat2gray(act1),'GridSize',[8 8]);
imshow(I)
Найдите самый сильный канал активации
Найдите самые сильные каналы, программно исследовав каналы с большими активациями. Найдите канал, который имеет самую большую активацию при помощи max
функционируйте, измените размер канала выход и отобразите активации.
[maxValue,maxValueIndex] = max(max(max(act1))); act1chMax = act1(:,:,:,maxValueIndex); act1chMax = mat2gray(act1chMax); act1chMax = imresize(act1chMax,inputSize(1:2)); I = imtile({inputImg,act1chMax}); imshow(I)
Сравните самое сильное изображение канала активации с оригинальным изображением. Этот канал активируется на ребрах. Это активируется положительно на легких левых/темных правых краях и негативно на темных левых/легких правых краях.
Проверьте результаты предсказания
Проверьте и отобразите результаты предсказания dlhdl.Simulator
объект при помощи predict
функция.
prediction = simObj.predict(single(inputImg)); [val, idx] = max(prediction); netTransfer.Layers(end).ClassNames{idx}
ans = 'MathWorks Cube'
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.