exponenta event banner

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

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

  • Формирование рукописных цифровых изображений в стиле набора данных MNIST.

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

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

В этом примере используется предварительно обученная сеть декодеров, основанная на вариационном автокодере поезда (VAE), для создания примера изображений из Toolbox™ глубокого обучения. Дополнительные сведения см. в разделе Настройка вариационного автокодера (VAE) для создания изображений (панель инструментов глубокого обучения).

Предварительные условия для сторонних производителей

Необходимый

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

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

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

Проверка среды графического процессора

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

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

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

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

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

В этом примере для создания изображений используется сеть декодеров, обученная в вариационном автокодере поезда (VAE). Чтобы обучить сеть самостоятельно, см. раздел Обучающий вариационный автокодировщик (VAE) для создания изображений (панель инструментов глубокого обучения).

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

generateVAE функция точки входа загружает dlnetwork объект из 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 свойства объекта конфигурации кода графического процессора.

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]))

См. также

Функции

Объекты

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

Подробнее