В этом примере показано, как сгенерировать MEX-функцию для обученной вариационной сети автоэнкодера (VAE), которая работает на центральных процессорах Intel ®. Пример иллюстрирует:
Генерация изображений нарисованных вручную цифр в стиле набора данных MNIST.
Генерация кода для dlnetwork
Объект (Deep Learning Toolbox), представляющий нейронную сеть для глубокого обучения с использованием библиотеки Intel MKL-DNN.
Использование dlarray
(Deep Learning Toolbox) объекты в генерации кода.
Этот пример использует предварительно обученную сеть декодера, основанную на Train Variational Autoencoder (VAE), для генерации изображений из Deep Learning Toolbox™. Для получения дополнительной информации см. «Train вариационного автоэнкодера (VAE) для генерации изображений (Deep Learning Toolbox)».
Процессор Intel с поддержкой инструкций Intel Advanced Vector Extensions 2 (Intel AVX2).
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Intel Math Kernel Library для глубоких нейронных сетей (MKL-DNN)
Для получения информации о поддерживаемых версиях компиляторов и библиотек смотрите Необходимые условия для глубокого обучения с MATLAB Coder
Этот пример не поддерживается в MATLAB ® Online.
Автоэнкодеры имеют две части: энкодер и декодер. Энкодер принимает изображение на вход и выводит сжатое представление (кодирование), которое является вектором размера latent_dim
, равное 20 в этом примере. Декодер принимает сжатое представление, декодирует его и воссоздает оригинальное изображение.
VAE отличаются от обычных автоэнкодеров тем, что они не используют процесс декодирования-кодирования для восстановления входа. Вместо этого они накладывают распределение вероятностей на скрытое пространство и изучают распределение так, чтобы распределение выходов от декодера совпадало с распределением наблюдаемых данных. Затем они получают выборку из этого распределения, чтобы сгенерировать новые данные.
Этот пример использует сеть декодера, обученную в примере Train Variational Autoencoder (VAE), для генерации изображений. Чтобы обучить сеть самостоятельно, смотрите Train Variational Autoencoder (VAE) для генерации изображений (Deep Learning Toolbox).
The generateVAE
функция точки входа загружает dlnetwork
объект из MAT-файла trainedDecoderVAENet в постоянную переменную и повторно использует постоянный объект для последующих вызовов предсказания. Он инициализирует dlarray
объект, содержащий 25 случайным образом сгенерированных кодировок, передает их через сеть декодера и извлекает числовые данные сгенерированного изображения из объекта глубокого обучения массива.
type('generateVAE.m')
function generatedImage = generateVAE(decoderNetFileName,latentDim,Environment) %#codegen % Copyright 2020-2021 The MathWorks, Inc. persistent decoderNet; if isempty(decoderNet) decoderNet = coder.loadDeepLearningNetwork(decoderNetFileName); end % Generate random noise randomNoise = dlarray(randn(1,1,latentDim,25,'single'),'SSCB'); if coder.target('MATLAB') && strcmp(Environment,'gpu') randomNoise = gpuArray(randomNoise); end % Generate new image from noise generatedImage = sigmoid(predict(decoderNet,randomNoise)); % Extract numeric data from dlarray generatedImage = extractdata(generatedImage); end
Оцените generateVAE
функция точки входа, чтобы сгенерировать изображения цифр и построить график результатов.
latentDim = 20; matfile = 'trainedDecoderVAENet.mat'; Env = ''; figure() title("Generated samples of digits - MATLAB") generatedImageML = generateVAE(matfile, latentDim, Env); imshow(imtile(generatedImageML, "ThumbnailSize", [100,100]))
Чтобы сгенерировать MEX-функцию для generateVAE
функция точки входа, создайте объект строения кода для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
функция для создания объекта строения глубокого обучения MKL-DNN и назначения его DeepLearningConfig
свойство объекта строения кода.
cfg = coder.config('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('mkldnn'); args = {coder.Constant(matfile), coder.Constant(latentDim), coder.Constant(Env)}; codegen -config cfg -args args generateVAE -report
Code generation successful: View report
Вызовите сгенерированный MEX и отобразите результаты.
figure() title("Generated samples of digits using MKL-DNN") generatedImage = generateVAE_mex(matfile, latentDim, Env); imshow(imtile(generatedImage, "ThumbnailSize", [100,100]))
codegen
| coder.config
| coder.DeepLearningConfig
| dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox)