Intel CPU での変分自己符号化器を使用した数字イメージの生成
この例では、Intel® CPU で実行される学習済み変分自己符号化器 (VAE) ネットワークの MEX 関数を生成する方法を示します。この例で示す内容は次のとおりです。
この例では、Deep Learning Toolbox™ の "変分自己符号化器 (VAE) の学習によるイメージ生成" の例に基づく事前学習済みの復号化器ネットワークを使用します。詳細については、変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)を参照してください。
サードパーティの前提条件
必須
Intel Advanced Vector Extensions 2 (Intel AVX2) の命令をサポートする Intel プロセッサ。
オプション
スタティック ライブラリ、ダイナミック ライブラリ、実行可能ファイルなどの MEX 以外のビルドについて、この例には次の追加要件があります。
Intel Math Kernel Library for Deep Neural Networks (MKL-DNN)
サポートされるコンパイラとライブラリのバージョンの詳細については深層学習に MATLAB Coder を使用するための前提条件を参照
この例は MATLAB® Online ではサポートされていません。
事前学習済みの変分自己符号化器ネットワーク
自己符号化器には、符号化器と復号化器の 2 つの部分があります。符号化器は、イメージ入力を受け取り、圧縮表現 (符号化) を出力します。これは、サイズ latent_dim
(この例では 20) のベクトルです。復号化器は、圧縮表現を受け取り、それを復号化して元のイメージを再作成します。
VAE は、通常の自己符号化器と異なり、入力の再構成に符号化と復号化のプロセスを使用しません。代わりに、潜在空間に確率分布を適用し、復号化器からの出力の分布と観測データの分布が一致するように分布を学習します。その後、この分布からサンプルを抽出して新しいデータを生成します。
この例では、"変分自己符号化器 (VAE) の学習によるイメージ生成" の例で学習させた復号化器ネットワークを使用します。ネットワーク自体の学習については、変分自己符号化器 (VAE) の学習によるイメージ生成 (Deep Learning Toolbox)を参照してください。
エントリポイント関数 generateVAE
エントリポイント関数 generateVAE
は、dlnetwork
オブジェクトを MAT ファイル trainedDecoderVAENet
から永続変数に読み込み、以降の予測呼び出しではその永続オブジェクトを再利用します。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 ターゲット向けのコード構成オブジェクトを作成し、ターゲット言語を 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)