Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

変分自己符号化器を使用した NVIDIA GPU での数字イメージの生成

この例では、学習済みの変分自己符号化器 (VAE) ネットワーク用に CUDA® MEX を生成する方法を示します。例では次を示します。

  • MNIST データ セットのスタイルにおける手描きの数字イメージの生成。

  • 深層学習ネットワークを表すdlnetwork (Deep Learning Toolbox)オブジェクト用の CUDA コード生成。

  • コード生成でのdlarray (Deep Learning Toolbox)オブジェクトの使用。

この例では、Deep Learning Toolbox™ の「変分自己符号化器 (VAE) の学習によるイメージ生成」の例に基づく事前学習済みの復号化器ネットワークを使用します。詳細については、変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)を参照してください。

サードパーティの必要条件

必須

  • CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。

オプション

スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。

GPU 環境の検証

この例を実行するためのコンパイラおよびライブラリが正しく設定されていることを確認するために、関数coder.checkGpuInstallを使用します。

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

事前学習済み変分自己符号化器ネットワーク

自己符号化器には、符号化器と復号化器の 2 つの部分があります。符号化器は、イメージ入力を受け取り、圧縮された表現を出力 (符号化) します。これはサイズが latent_dim (この例では 20) のベクトルです。復号化器は圧縮表現を受け取り、復号化して元のイメージを再作成します。

VAE は入力の再構成に符号化と復号化の処理を行わないという点で、通常の自己符号化器と異なります。代わりに、潜在空間上に確率分布を適用してその分布を学習することで、復号化器からの出力の分布と観測データの分布を一致させます。その後、この分布からサンプリングして新しいデータを生成します。

この例では、「変分自己符号化器 (VAE) の学習によるイメージ生成」の例で学習させた復号化器ネットワークを使用します。自分でネットワークに学習させるには、変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)を参照してください。

trainedVAENetworkDND.png

エントリポイント関数 generateVAE

エントリポイント関数 generateVAE は、dlnetwork オブジェクトを trainedDecoderVAENet MAT ファイルから永続変数に読み込み、以降の予測呼び出しでその永続オブジェクトを再利用します。ランダムに生成された 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]))

CUDA MEX の生成

エントリポイント関数 generateVAE 用の CUDA コードを生成するには、MEX ターゲットの GPU コード構成オブジェクトを作成し、ターゲット言語を C++ に設定します。関数coder.DeepLearningConfigを使用して CuDNN 深層学習構成オブジェクトを作成し、それを GPU コード構成オブジェクトの 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

TensorRT ターゲット用の CUDA コードを生成するには、CuDNN 構成オブジェクトではなく、TensorRT 深層学習構成オブジェクトを使用します。

生成された MEX の実行

生成された CUDA MEX を呼び出し、結果を表示します。

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

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

エントリポイント関数 generateVAE は、ランダムに生成された符号化を使用して dlarray オブジェクトを初期化し、それらを復号化器ネットワークに渡し、深層学習配列オブジェクトから生成されたイメージの数値データを抽出します。その結果、MATLAB シミュレーション中に生成されたイメージは、MEX 関数呼び出しによって生成されたイメージとは異なるものになります。

参考

関数

オブジェクト

関連する例

詳細