主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

変分自己符号化器(VAE)の学習によるイメージ生成

この例では,MATLABで変分自己符号化器(VAE)を作成して数字のイメージを生成する方法を説明します。VAEは,手書きの数字をMNISTデータセットのスタイルで生成します。

vaeはは力の再成に符符号。とと化のいう点,通常の自己点で,通行の自己符でと异なり。代わりに,空间上に确率确率を适しそのに确率を习习するで,尺号化器からからの力の分布と観测データのますを后,この分布からし新闻データを生成して新闻。

この例では,VAEネットワークを構築し,MNISTデータセットで学習させ,データセット内のイメージによく似た新しいイメージを生成します。

データの読み込み

MNISTファイルをhttp://yann.lecun.com/exdb/mnist/からダウンロードし,MNISTデータセットをワークスペースに読み込みます[1]。ファイルを解凍して作業ディレクトリに保存した後,この例に添付されている補助関数processimagesmnist.processlabelsmnist.を呼び出して,ファイルファイルmatlab配列にデータをますますます。

vaeは,再构筑された数码ををととし,カテゴリカルラベルと比较のではないため,mnistデータセットの习习ラベルを使使するするはありませませませ

trainImagesFile ='train-images.idx3-ubyte';testimagesfile =“t10k-images.idx3-ubyte”;testLabelsFile =“t10k-labels.idx1-ubyte”;xtrain = processimagesmnist(TrainimagesFile);
阅读Mnist图像数据...数据集中的图像数量:60000 ...
numTrainImages =大小(XTrain 4);XTest = processImagesMNIST (testImagesFile);
读取MNIST图像数据…数据集中的图像数量:10000…
欧美= processLabelsMNIST (testLabelsFile);
阅读Mnist标签数据...数据集中的标签数:10000 ...

ネットワークの构筑

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

計算を数値的に安定させるには,ネットワークに分散の対数から学習させて,取りうる値の範囲を[0,1]から[负0]に増やします。サイズlatent_dim.の2つのベクトルを定义ます.1つは平均 μ. ,もう1つは分享の位数 日志 σ. 2 ですにこれら2つのベクトルを使使使し,サンプリングの元になる分布を作物。

2次元畳み込みと,その后にに全全层层使使して,28 x 28 x 1のmnistイメージイメージをを空におけるにおける符化にしし后,転置2次元畳み込みを使し1 x 1 x20のの号化を28 x 28 x 1のイメージにスケールスケールアップして戻し。

latentDim = 20;imageSize = [28 28 1];encoderLG = layerGraph([imageInputLayer(imageSize,'姓名''input_encoder''正常化''没有任何')卷积2dlayer(3,32,'填充'“相同”'走吧'2,'姓名'“conv1”)剥离('姓名''relu1'64年)convolution2dLayer(3日,'填充'“相同”'走吧'2,'姓名''conv2')剥离('姓名'“relu2”(2 * latentDim,'姓名''fc_encoder')));decoderLG = layerGraph([imageInputLayer([1 1 latentDim]),'姓名''一世''正常化''没有任何')TransposedConv2dlayer(7,64,'裁剪'“相同”'走吧'7,'姓名'“transpose1”)剥离('姓名''relu1'64年)transposedConv2dLayer(3日,'裁剪'“相同”'走吧'2,'姓名''transposs2')剥离('姓名'“relu2”)TransposedConv2dlayer(3,32,'裁剪'“相同”'走吧'2,'姓名''transposs3')剥离('姓名'“relu3”)TransposedConv2dlayer(3,1,'裁剪'“相同”'姓名''transposs4')));

カスタム学习ループをを使をて両のネットワークに学习させて自动微を有条学にするため,层グラフをdlnetwork.オブジェクトに変换します。

Encodernet = DLnetwork(Encoderlg);decodernet = dlnetwork(decoderlg);

モデル勾配関数の定義

補助関数modelGradientsは,符号化器と復号化器のdlnetwork.オブジェクトと入力データのミニバッチXを受け取り,ネットワーク内の学習可能なパラメーターについての損失の勾配を返します。この補助関数の定義は,この例の終わりで行います。

关关ははこの处处处サンプリングと损失の2つのつの手顺でで実しサンプリングの手顺で,平台と手顺は,平台と分类のベクトルサンプリングて,复复化器ネットワーク渡される最终的なな符符。ただし,作者为之は不可なな,“再パラメーター化のトリック”を使用しなければなりません。このトリックでは,無作為抽出操作を補助変数 ε. に移动词ます。そのその,これこれ平均 μ. 一世 ででシフト,标准标准 σ. 一世 でスケーリングします。ここでは, N μ. 一世 σ. 一世 2 からのサンプリングは μ. 一世 + ε. σ. 一世 からからのサンプリングと同じ同じと考え考え考え考えでで, ε. N 0. 1 です。次の図に,この考え方を視覚的に示します。

损失の手顺では,サンプリングステップで生成された符化。复をを,损失を渡し,これを使ってを计算し.vaeの损失は,変ますのの损失,変変损失损失はは限れ,2つの个别の项の和として定义され。

ELBO 损失 = 重建 损失 + 吉隆坡 损失

“〖化成〗”は,复号化器のの力が元の力にどれだけかを,平台二乘误差(MSE)をを二乘ししてししし

重建 损失 = MSE 解码器 输出 原始 图片

吉隆坡損失”,つまりカルバック・ライブラーダイバージェンスは,2つの確率分布の差を測定します。この場合,KL損失の最小化によって,学習した平均と分散がターゲット(正規)分布にできる限り近づくようにします。サイズ N の现出,kl损失は次のににされ。

吉隆坡 损失 = - 0. 5. 一世 = 1 N 1 + 日志 σ. 一世 - μ. 一世 2 - σ. 一世 2

kl损失项を含めることで,再构成のによりにより习したクラスターを潜ー潜の中心の周りにさて,サンプリング元となる空を构成するいう実実なが得られますます效果效果得ますますます效果が得られられ

学習オプションの指定

GPUで学習させます(并行计算工具箱™が必要です)。GPUがない場合,execultenvironment.“中央处理器”に設定します。

executionenvironment =“汽车”

ネットワークの学習オプションを設定します。亚当オプティマイザーを使用する場合は,各ネットワークについて,移動平均勾配と移動平均2乗勾配の減衰率を空の配列に初期化する必要があります

numepochs = 50;minibatchsize = 512;LR = 1E-3;numiterations =楼层(numtrainimages / minibatchsize);迭代= 0;avggradientsencoder = [];avggradientssquaredencoder = [];avggradientsdecoder = [];avggradientssquareddecoder = [];

モデルの学習

カスタム学习ループループ使使てに学习。

エポック内のそれぞれの反復で,次を行います。

  • 学习习セットから次ミニバッチを取得。

  • ミニバッチをdlarray.オブジェクトオブジェクトに。次元次元ラベル“SSCB”(空间、空间、通道、批处理)を指定していることを確認してください。

  • GPUで学习する合成,dlarray.gpuArrayオブジェクトオブジェクト変换。

  • 关节dlfevalおよびmodelGradientsをを用してモデルの勾配评価评価评価。

  • 关节adamupdate采用使使のてて,両方のネットワークの学习。

各エポックの最後に,自己符号化器にテストセットのイメージを渡し,そのエポックの損失と学習時間を表示します。

为了epoch = 1:numEpochs tic;为了i = 1:numiterations迭代=迭代+ 1;IDX =(I-1)*小匹匹配+ 1:i *小匹匹配;Xbatch = XTrain(::::,IDX);xbatch = dlarray(单(xbatch),“SSCB”);如果(executionEnvironment = =“汽车”&& canusegpu)||executionenvironment ==.“图形”XBatch = gpuArray (XBatch);结尾[infgrad,gengrad] = dlfeval(...@modelGradients, encoderNet, decoderNet, XBatch);[decoderNet。可学的,avgGradientsDecoder, avgGradientsSquaredDecoder] =...adamupdate(decodernet.learnables,...Gengrad,AvggradientsDecoder,AvggradientsSquaredDecoder,迭代,LR);[Encodernet.Learnables,AvggradientsEncoder,avggradientssquaredencoder] =...adamupdate (encoderNet。可学的,...infGrad, avgGradientsEncoder, avgGradientsSquaredEncoder, iteration, lr);结尾elapsedTime = toc;[z, zMean, zLogvar] =采样(encoderNet, XTest);xPred = sigmoid(forward(decoderNet, z));elbo = ELBOloss(XTest, xPred, zMean, zLogvar);disp (”时代:“+时代+"测试ELBO损耗= "+收集(extractdata (elbo)) +...".纪元所花费的时间= "+ Elapsedtime +“s”结尾
时代:1测试eLbo损失= 27.0561。纪元= 33.0037S时代的时间:2试验eLbo损失= 24.414。EPOCH = 32.4167S时期所花费的时间:3试验ELBO损失= 23.0166。纪元= 32.3244S时代的时间= 32.3244S时代:4试验eLBO损失= 20.9078。纪元= 32.1268S时代的时间:5试验eLbo损失= 20.6519。纪元= 32.3451S时代的时间= 32.3451S时代:6试验eLBO损失= 20.3201。EPOCH = 32.4371S时代的时间= 32.4371S时期:7试验eLBO损失= 19.9266。纪元= 32.4551S时代的时间:8试验eLbo损失= 19.8448。纪元= 32.9919S时代占地:9试验eLBO损失= 19.7485。纪元= 33.1783s时代= 33.1783s时代:10试验eLbo损失= 19.6295。 Time taken for epoch = 33.1623s Epoch : 11 Test ELBO loss = 19.539. Time taken for epoch = 32.4781s Epoch : 12 Test ELBO loss = 19.4682. Time taken for epoch = 32.5094s Epoch : 13 Test ELBO loss = 19.3577. Time taken for epoch = 32.5996s Epoch : 14 Test ELBO loss = 19.3247. Time taken for epoch = 32.6447s Epoch : 15 Test ELBO loss = 19.3043. Time taken for epoch = 32.2494s Epoch : 16 Test ELBO loss = 19.2948. Time taken for epoch = 32.5408s Epoch : 17 Test ELBO loss = 19.191. Time taken for epoch = 32.8177s Epoch : 18 Test ELBO loss = 19.1075. Time taken for epoch = 32.5982s Epoch : 19 Test ELBO loss = 19.0606. Time taken for epoch = 33.7771s Epoch : 20 Test ELBO loss = 19.0298. Time taken for epoch = 33.6249s Epoch : 21 Test ELBO loss = 19.0534. Time taken for epoch = 33.4906s Epoch : 22 Test ELBO loss = 18.9859. Time taken for epoch = 33.1101s Epoch : 23 Test ELBO loss = 19.0077. Time taken for epoch = 32.7345s Epoch : 24 Test ELBO loss = 18.9963. Time taken for epoch = 33.0067s Epoch : 25 Test ELBO loss = 18.9189. Time taken for epoch = 32.891s Epoch : 26 Test ELBO loss = 18.8925. Time taken for epoch = 33.0905s Epoch : 27 Test ELBO loss = 18.9182. Time taken for epoch = 32.6203s Epoch : 28 Test ELBO loss = 18.8664. Time taken for epoch = 32.4095s Epoch : 29 Test ELBO loss = 18.8512. Time taken for epoch = 32.4317s Epoch : 30 Test ELBO loss = 18.7983. Time taken for epoch = 32.4s Epoch : 31 Test ELBO loss = 18.7971. Time taken for epoch = 32.4902s Epoch : 32 Test ELBO loss = 18.7888. Time taken for epoch = 32.2591s Epoch : 33 Test ELBO loss = 18.7811. Time taken for epoch = 32.4291s Epoch : 34 Test ELBO loss = 18.7804. Time taken for epoch = 32.5968s Epoch : 35 Test ELBO loss = 18.7839. Time taken for epoch = 32.3787s Epoch : 36 Test ELBO loss = 18.7045. Time taken for epoch = 32.6078s Epoch : 37 Test ELBO loss = 18.7783. Time taken for epoch = 32.6429s Epoch : 38 Test ELBO loss = 18.7068. Time taken for epoch = 32.7032s Epoch : 39 Test ELBO loss = 18.6822. Time taken for epoch = 32.3438s Epoch : 40 Test ELBO loss = 18.7155. Time taken for epoch = 32.6521s Epoch : 41 Test ELBO loss = 18.7161. Time taken for epoch = 32.5532s Epoch : 42 Test ELBO loss = 18.6597. Time taken for epoch = 32.6419s Epoch : 43 Test ELBO loss = 18.6657. Time taken for epoch = 32.4558s Epoch : 44 Test ELBO loss = 18.5996. Time taken for epoch = 32.5503s Epoch : 45 Test ELBO loss = 18.6666. Time taken for epoch = 32.5503s Epoch : 46 Test ELBO loss = 18.6449. Time taken for epoch = 32.2981s Epoch : 47 Test ELBO loss = 18.6107. Time taken for epoch = 32.3152s Epoch : 48 Test ELBO loss = 18.6393. Time taken for epoch = 32.7135s Epoch : 49 Test ELBO loss = 18.6351. Time taken for epoch = 32.3859s Epoch : 50 Test ELBO loss = 18.5955. Time taken for epoch = 32.6549s

結果の可視化

结果を可化化し解釈するには,补助の可視化関数これらの补助关键词これら,この例の最后にます。

关节Visualiereconstruction.は,各クラスからランダムに選択された数字と,自己符号化器を通過した後の再構築を一緒に表示します。

关节visualizelatentspace.は,テストテストイメージをををネットワークに渡した后にに生された(それぞれ次元が20の)平均とが20のの符を,各イメージの符符のをを列に対しての编号化学(PCA)を実后,最初,最初の2つの主成成分によって特徴付けた2つの次元における平等ととで定义された潜で定义された潜。

关节生成は,正規分布からサンプリングされた新しい符号化を初期化し,これらの符号化が復号化器ネットワークを通過するときに生成されたイメージを出力します。

visualizerconstruction (XTest, YTest, encoderNet, decoderNet)

visualizeLatentSpace (XTest欧美encoderNet)

生成(Decodernet,Latentdim)

次のステップ

生成タスクの実行に使用できるモデルは数多くあり,変分自己符号化器はその1つに過ぎません。変分自己符号化器は,イメージが小さく,特徴が明確に定義されているデータセット(MNISTなど)に対して適切に機能します。イメージが大きく,より複雑なデータセットの場合は,敵対的生成ネットワーク(GAN)の方がより効果的に機能し,ノイズの少ないイメージを生成する傾向にあります。氮化镓を実装して64 x 64のRGBイメージを生成する方法を示す例については,敵対的生成ネットワーク(GAN)の学習を参照してください。

参考文献

  1. Lecun,Y.,C. Cortes,以及C. J. C.博览会。“手写数字的Mnist数据库。”http://yann.lecun.com/exdb/mnist/

補助関数

モデル勾配関数

关节modelGradientsは符号化器と復号化器のdlnetwork.オブジェクトオブジェクト,入力データXのミニバッチを受け取り,学習可能なネットワークパラメーターについての損失の勾配を返します。この関数は3つの処理を行います。

  1. 符号化器ネットワークに渡さ渡されたイメージのミニバッチに対してに対してに対して抽样をを,符号化を取得。

  2. 復号化器ネットワークに符号化を渡して関数ELBOlossを呼び出し,損失を取得する。

  3. 关节dlgradientを呼び出し,両方のネットワークに対して学習可能なパラメーターについての損失の勾配を計算する。

函数[Infgrad,Gen​​grad] = MapeStriants(Encodernet,Decodernet,x)[z,zmean,zlogvar] =采样(eNcodernet,x);xPred = sigmoid(forward(decoderNet, z));丢失= elboloss(x,xpred,zmean,zlogvar);[GENGRAD,INFGRAD] = DLGRADIENT(丢失,DECODERNET.LEARNABLE,...EncoDernet.Learnables);结尾

サンプリングと損失関数

关节抽样は,入力イメージから符号化を取得します。最初に,イメージのミニバッチを符号化器ネットワークに渡して,サイズ(2 * Latentdim)*小匹匹配ののサイズの列列サイズはサイズサイズlatentDim * batchSizeです。次に,これらこれら行列使してパラメーター化トリックのとと化の计算ますますます。最后最后,尺寸化。SCCBフォーマットのdlarray.オブジェクトに変换します。

函数[zsampled,zmean,zlogvar] =采样(eNODernet,x)压缩=向前(Encodernet,x);d =尺寸(压缩,1)/ 2;zmean =压缩(1:d,:);zlogvar =压缩(1 + D:结束,:);sz = size(zmean);epsilon = randn(sz);sigma = exp(.5 * zlogvar);z = epsilon。* sigma + zmean;z =重塑(z,[1,1,sz]);zsampled = dlarray(z,“SSCB”);结尾

关节ELBOlossは,关节抽样から返された平衡と受け取り受け取り,eLbo损失の计算にし。

函数elbo = ELBOloss(x, xPred, zMean, zLogvar) square = 0.5*(xPred-x).^2;reconstructionLoss = sum(平方和,[1,2,3]);KL = -。5.* sum(1 + zLogvar - zMean.^2 - exp(zLogvar), 1); elbo = mean(reconstructionLoss + KL);结尾

可視化関数

关节Visualiereconstruction.は,MNISTデータセットの各数字に対して2つのイメージをランダムに選択してVAEに渡し,元の入力と並べて再構成をプロットします。dlarray.オブジェクト内に含まれる情れるプロットプロットするに,最初に关联extractdata收集を使用して抽出する必要があることに注意してください。

函数visualizerconstruction (XTest,YTest, encoderNet, decoderNet) f = figure;图(f)标题(“示例地面真相图像与重建图像”为了i = 1:2为了c = 0:9 idx = irandomidxofclass(ytest,c);x = xtest(::,:,idx);[z,〜,〜] =采样(Encodernet,x);Xpred = sigmoid(前进(Decodernet,z));x =收集(提取数据(x));Xpred =收集(提取数据(Xpred));比较= [x,x,(size(x,1),1),xpred];子图(4,5,(I-1)* 10 + C + 1),imshow(比较,[]),结尾结尾结尾函数Idx = iRandomidXofclass(t,c)idx = t ==分类(c);idx = find(idx);idx = idx(randi(numel(idx),1));结尾

关节visualizelatentspace.は,符码化ネットワークののを构成する平衡ととれるの行列定义される潜潜潜をををしし表现潜でさ。

この関数は,最初にdlarray.オブジェクトから平均と分散の行列を抽出します。チャネル/バッチ次元(CとB)をもつ行列の転置は不可能であるため,関数は行列を転置する前に剥离丁片を呼び出します。次に,両方の行列に対して主成分分析(PCA)を行います。潜在空間を2次元で可視化するために,関数は最初の2つの主成分を保持し,これらを互いに対してプロットします。最後に,数字のクラスを色付けしてクラスターを観察できるようにします。

函数VisualizElatentsPace(xtest,ytest,endodernet)[〜,zmean,zlogvar] =采样(Encodernet,xtest);zmean = stribdims(zmean)';zmean =收集(提取数据(zmean));zlogvar = stribdims(zlogvar)';zlogvar =收集(提取数据(zlogvar));[〜,Scoremean] = PCA(Zmean);[〜,scoreLogvar] = PCA(Zlogvar);c = parula(10);F1 =数字;图(F1)标题(“潜在的空间”) ah = subplot(1,2,1);散射(scoreMean (:, 2), scoreMean (: 1), [], c(双重(欧美):));啊。YDir ='逆转';轴平等的包含(“z_m_u(2)”) ylabel (“z_m_u(1)”) cb = colorbar;cb。蜱虫= 0 (1/9):1;cb。TickLabels =字符串(0:9);啊=情节(1、2、2);散射(scoreLogvar (:, 2), scoreLogvar (: 1), [], c(双重(欧美):));啊。YDir ='逆转';包含(“Z_v_a_r(2)”) ylabel (“z_v_a_r(1)”) cb = colorbar;cb。蜱虫= 0 (1/9):1;cb。TickLabels =字符串(0:9);轴平等的结尾

关节生成は,vaeの生成能力をテスト生成さた25个の符符を含むdlarray.オブジェクトオブジェクトを期化工,钢材化器材。

函数randomNoise = dlarray(randn(1,1,latentDim,25),“SSCB”);ConsigationImage = Sigmoid(预测(Decodernet,RandomNoise));babledimage =提取数据(bafectwardimage);F3 =图;图(f3)imshow(imtile(contabtionImage,“thumbnailsize”,[100,100]))标题(“生成的数字样本”)绘制结尾

参考

||||||

关键词トピック