В этом примере показано, как сгенерировать CUDA ® MEX для обученной сети вариационного автоэнкодера (VAE). Пример иллюстрирует:
Этот пример использует предварительно обученную сеть декодера, основанную на Train Variational Autoencoder (VAE), для генерации изображений из Deep Learning Toolbox™. Для получения дополнительной информации см. «Train вариационного автоэнкодера (VAE) для генерации изображений (Deep Learning Toolbox)».
CUDA включает графический процессор NVIDIA ® и совместимый драйвер.
Для сборок, не являющихся MEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.
Инструментарий NVIDIA CUDA.
Библиотека NVIDIA cuDNN.
Переменные окружения для компиляторов и библиотек. Для получения дополнительной информации см. раздел «Оборудование сторонних производителей» и «Настройка продуктов для подготовки».
Чтобы убедиться, что компиляторы и библиотеки для выполнения этого примера настроены правильно, используйте coder.checkGpuInstall
функция.
envCfg = coder.gpuEnvConfig('host'); envCfg.DeepLibTarget = 'cudnn'; envCfg.DeepCodegen = 1; envCfg.Quiet = 1; coder.checkGpuInstall(envCfg);
Автоэнкодеры имеют две части: энкодер и декодер. Энкодер принимает изображение на вход и выводит сжатое представление (кодирование), которое является вектором размера 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]))
Чтобы сгенерировать код CUDA для generateVAE
функция точки входа, создайте объект строения кода GPU для цели MEX и установите целевой язык на C++. Используйте coder.DeepLearningConfig
функция для создания объекта строения глубокого обучения CuDNN и назначения его DeepLearningConfig
свойство объекта строения кода GPU.
Env = 'gpu'; cfg = coder.gpuConfig('mex'); cfg.TargetLang = 'C++'; cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn'); args = {coder.Constant(matfile), coder.Constant(latentDim), coder.Constant(Env)}; codegen -config cfg -args args generateVAE -report
Code generation successful: View report
Чтобы сгенерировать код CUDA для цели TensorRT, создайте и используйте объект строения глубокого обучения TensorRT вместо объекта строения CuDNN.
Вызовите сгенерированный CUDA MEX и отобразите результаты.
figure() title("Generated samples of digits - GPU") generatedImageGPU = generateVAE_mex(matfile, latentDim, Env); imshow(imtile(generatedImageGPU, "ThumbnailSize", [100,100]))
coder.CuDNNConfig
| coder.gpuConfig
| coder.gpuEnvConfig
| coder.TensorRTConfig
| dlarray
(Deep Learning Toolbox) | dlnetwork
(Deep Learning Toolbox)