主要内容

在 Intel CPU 上使用变分自编码器生成数字图像

此示例说明如何为在 Intel® CPU 上运行的经过训练的变分自编码器 (VAE) 网络生成 MEX 函数。该示例说明:

  • 生成 MNIST 数据集样式的手绘数字图像。

  • 使用 Intel MKL-DNN 库为表示深度学习网络的 dlnetwork (Deep Learning Toolbox) 对象生成代码。

  • 在代码生成中使用 dlarray (Deep Learning Toolbox) 对象。

此示例使用基于 Deep Learning Toolbox™ 提供的训练变分自编码器 (VAE) 生成图像示例的预训练解码器网络。有关详细信息,请参阅训练变分自编码器 (VAE) 以生成图像 (Deep Learning Toolbox)

第三方前提条件

必需

  • 支持 Intel Advanced Vector Extensions 2 (Intel AVX2) 指令的 Intel 处理器。

可选

对于非 MEX 编译,如静态、动态库或可执行文件,此示例有以下附加要求。

MATLAB® Online 不支持此示例。

预训练的变分自编码器网络

自编码器有两个部分:编码器和解码器。编码器接受一个图像输入并输出一个压缩表示(编码),该压缩表示是大小为 latent_dim 的向量,在此示例中等于 20。解码器接受该压缩表示,对其进行解码,并重新创建原始图像。

VAE 不同于常规的自编码器,因为它们不使用编码解码过程来重新构造输入。它们在潜在空间上施加一个概率分布,并且学习该分布,使得来自解码器的输出的分布与观测到的数据的分布相匹配。然后,它们从这个分布中采样以生成新数据。

此示例使用在训练变分自编码器 (VAE) 生成图像示例中训练的解码器网络。要自己训练网络,请参阅训练变分自编码器 (VAE) 以生成图像 (Deep Learning Toolbox)

trainedVAENetworkDND.png

generateVAE 入口函数

generateVAE 入口函数将 trainedDecoderVAENet MAT 文件中的 dlnetwork 对象加载到持久变量中,并在后续预测调用中重用该持久性对象。它初始化一个包含 25 个随机生成的编码的 dlarray 对象,将这些编码传入解码器网络进行处理,并从深度学习数组对象中提取所生成图像的数值数据。

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

Figure contains an axes object. The axes object contains an object of type image.

生成 MEX 函数

要为 generateVAE 入口函数生成 MEX 函数,请为 MEX 目标创建一个 GPU 代码配置对象,并将目标语言设置为 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

调用生成的 MEX 并显示结果。

figure()
title("Generated samples of digits using MKL-DNN")

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

Figure contains an axes object. The axes object contains an object of type image.

generateVAE 入口函数使用随机生成的编码初始化 dlarray 对象,将这些编码传入解码器网络进行处理,并从深度学习数组对象中提取所生成图像的数值数据。因此,MATLAB 仿真期间生成的图像不同于 MEX 函数调用生成的图像。

另请参阅

| | | (Deep Learning Toolbox) | (Deep Learning Toolbox)

主题