Сгенерируйте изображения цифры на NVIDIA графический процессор Используя вариационный автоэнкодер

В этом примере показано, как сгенерировать CUDA® MEX для обученной вариационной сети (VAE) автоэнкодера. Пример иллюстрирует:

  • Генерация нарисованной от руки цифры отображает в стиле набора данных MNIST.

  • Генерация кода CUDA для dlnetwork Объект (Deep Learning Toolbox), представляющий нейронную сеть для глубокого обучения.

  • Использование dlarray (Deep Learning Toolbox) возражает в генерации кода.

Этот пример использует предварительно обученную сеть декодера на основе Обучения Вариационного Автоэнкодера (VAE), чтобы Сгенерировать пример Изображений от Deep Learning Toolbox™. Для получения дополнительной информации смотрите, Обучают Вариационный Автоэнкодер (VAE) Генерировать Изображения (Deep Learning Toolbox).

Сторонние необходимые условия

Необходимый

  • CUDA включил NVIDIA® графический процессор и совместимый драйвер.

Дополнительный

Для сборок неMEX, таких как статические, динамические библиотеки или исполняемые файлы, этот пример имеет следующие дополнительные требования.

Проверьте среду графического процессора

Чтобы проверить, что компиляторы и библиотеки для выполнения этого примера настраиваются правильно, используйте coder.checkGpuInstall функция.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

Предварительно обученная вариационная сеть автоэнкодера

Автоэнкодеры имеют две части: энкодер и декодер. Энкодер берет вход изображений и выводит сжатое представление (кодирование), который является вектором из размера latent_dim, равняйтесь 20 в этом примере. Декодер берет сжатое представление, декодирует его и воссоздает оригинальное изображение.

VAEs отличаются от обычных автоэнкодеров в этом, они не используют декодирующий кодирование процесс, чтобы восстановить вход. Вместо этого они налагают вероятностное распределение на скрытый пробел и изучают распределение так, чтобы распределение выходных параметров от соответствий декодера те из наблюдаемых данных. Затем они производят от этого распределения, чтобы сгенерировать новые данные.

Этот пример использует сеть декодера, обученную в Обучении Вариационного Автоэнкодера (VAE), чтобы Сгенерировать пример Изображений. Чтобы обучить сеть самостоятельно, смотрите, Обучают Вариационный Автоэнкодер (VAE) Генерировать Изображения (Deep Learning Toolbox).

generateVAE Функция Точки входа

generateVAE функция точки входа загружает dlnetwork объект из trainedDecoderVAENet MAT-файла в персистентную переменную и повторные использования постоянный объект для последующих вызовов предсказания. Это инициализирует 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 CUDA

Сгенерировать код CUDA для generateVAE функция точки входа, создайте объект настройки графического процессора кода для цели MEX и установите выходной язык на C++. Используйте coder.DeepLearningConfig функция, чтобы создать настройку глубокого обучения CuDNN возражает и присвоить ее DeepLearningConfig свойство объекта настройки графического процессора кода.

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.

Запустите сгенерированный MEX

Вызовите сгенерированный MEX CUDA и отобразите результаты.

figure()
title("Generated samples of digits - GPU")

generatedImageGPU = generateVAE_mex(matfile, latentDim, Env);
imshow(imtile(generatedImageGPU, "ThumbnailSize", [100,100]))

Смотрите также

Функции

Объекты

Связанные примеры

Больше о