このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
変分自己符号化器を使用した NVIDIA GPU での数字イメージの生成
この例では、学習済みの変分自己符号化器 (VAE) ネットワーク用に CUDA® MEX を生成する方法を示します。例では次を示します。
この例では、Deep Learning Toolbox™ の「変分自己符号化器 (VAE) の学習によるイメージ生成」の例に基づく事前学習済みの復号化器ネットワークを使用します。詳細については、変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)を参照してください。
サードパーティの必要条件
必須
CUDA 対応 NVIDIA® GPU および互換性のあるドライバー。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、または実行可能ファイルなどの MEX 以外のビルドについて、この例では以下の要件も適用されます。
NVIDIA CUDA Toolkit。
NVIDIA cuDNN ライブラリ。
コンパイラおよびライブラリの環境変数。詳細については、サードパーティ ハードウェアと前提条件となる製品の設定を参照してください。
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)を参照してください。
エントリポイント関数 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 関数呼び出しによって生成されたイメージとは異なるものになります。
参考
関数
オブジェクト
coder.gpuConfig
|coder.gpuEnvConfig
|coder.CuDNNConfig
|coder.TensorRTConfig
|dlarray
(Deep Learning Toolbox) |dlnetwork
(Deep Learning Toolbox)
関連する例
- 変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)
詳細
- dlarray 用のコード生成
- コード生成での dlarray の制限
- カスタム学習ループ、損失関数、およびネットワークの定義 (Deep Learning Toolbox)
- カスタム学習ループを使用したネットワークの学習 (Deep Learning Toolbox)
- dlnetwork オブジェクトを使用した予測の実行 (Deep Learning Toolbox)