在 Intel CPU 上使用变分自编码器生成数字图像
此示例说明如何为在 Intel® CPU 上运行的经过训练的变分自编码器 (VAE) 网络生成 MEX 函数。该示例说明:
此示例使用基于 Deep Learning Toolbox™ 提供的训练变分自编码器 (VAE) 生成图像示例的预训练解码器网络。有关详细信息,请参阅训练变分自编码器 (VAE) 以生成图像 (Deep Learning Toolbox)。
第三方前提条件
必需
支持 Intel Advanced Vector Extensions 2 (Intel AVX2) 指令的 Intel 处理器。
可选
对于非 MEX 编译,如静态、动态库或可执行文件,此示例有以下附加要求。
用于深度神经网络的 Intel 数学核心函数库 (MKL-DNN)
有关支持的编译器和库的版本的信息,请参阅使用 MATLAB Coder 进行深度学习的前提条件。
MATLAB® Online 不支持此示例。
预训练的变分自编码器网络
自编码器有两个部分:编码器和解码器。编码器接受一个图像输入并输出一个压缩表示(编码),该压缩表示是大小为 latent_dim 的向量,在此示例中等于 20。解码器接受该压缩表示,对其进行解码,并重新创建原始图像。
VAE 不同于常规的自编码器,因为它们不使用编码解码过程来重新构造输入。它们在潜在空间上施加一个概率分布,并且学习该分布,使得来自解码器的输出的分布与观测到的数据的分布相匹配。然后,它们从这个分布中采样以生成新数据。
此示例使用在训练变分自编码器 (VAE) 生成图像示例中训练的解码器网络。要自己训练网络,请参阅训练变分自编码器 (VAE) 以生成图像 (Deep Learning Toolbox)。

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

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

generateVAE 入口函数使用随机生成的编码初始化 dlarray 对象,将这些编码传入解码器网络进行处理,并从深度学习数组对象中提取所生成图像的数值数据。因此,MATLAB 仿真期间生成的图像不同于 MEX 函数调用生成的图像。
另请参阅
coder.DeepLearningConfig | codegen | coder.config | dlarray (Deep Learning Toolbox) | dlnetwork (Deep Learning Toolbox)
主题
- 训练变分自编码器 (VAE) 以生成图像 (Deep Learning Toolbox)
- dlarray Limitations for Code Generation
- Code Generation for dlarray