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

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

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

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

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

Этот пример использует предварительно обученную сеть декодера, основанную на Train Variational Autoencoder (VAE), для генерации изображений из Deep Learning Toolbox™. Для получения дополнительной информации см. «Train вариационного автоэнкодера (VAE) для генерации изображений (Deep Learning Toolbox)».

Необходимые условия для третьих лиц

Необходимый

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

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

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

Проверьте окружение GPU

Чтобы убедиться, что компиляторы и библиотеки для выполнения этого примера настроены правильно, используйте 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).

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

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 MEX

Чтобы сгенерировать код 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.

Запуск сгенерированного MEX

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

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

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

См. также

Функции

Объекты

Похожие примеры

Подробнее о