Main Content

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 ではサポートされていません。

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

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

VAE は、通常の自己符号化器と異なり、入力の再構成に符号化と復号化のプロセスを使用しません。代わりに、潜在空間に確率分布を適用し、復号化器からの出力の分布と観測データの分布が一致するように分布を学習します。その後、この分布からサンプルを抽出して新しいデータを生成します。

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

trainedVAENetworkDND.png

エントリポイント関数 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]))

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

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

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

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

参考

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

関連する例

詳細