主要内容

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

この例では,深層学習変分自己符号化器(vae)に学習させ,メジを生成する方法を説明します。

デ,タの集合内の観測値を強く表すデ,タを生成するために,変分自己符号化器を使用できます。自己符号化器は,入力を低次元空間に変換(符号化ステップ)し,低次元表現から入力を再構成(復号化ステップ)することによって,入力を複製するように学習させるモデルの一種です。

この図は,数字の。

変分自己符号化器を使用して新しい。

"変分"自己符号化器は,潜在空間に確率分布を適用してその分布を学習することで,復号化器からの出力の分布と観測データの分布を一致させるという点で,通常の自己符号化器と異なります。特に,潜在出力は,符号化器が学習した分布からランダムにサンプリングされます。

この例では,学習用に60000個の手書き数字のグレースケールイメージ,テスト用に10000個のイメージを含むMNISTデータセット[1]を使用します。

デ,タの読み込み

http://yann.lecun.com/exdb/mnist/から学習用とテスト用のMNISTファイルをダウンロードし,この例にサポートファイルとして添付されている関数processImagesMNISTを使用して▪▪メ▪▪ジを抽出します。この関数にアクセスするには,この例をラ。Vaeはラベル付けされたデ,タを必要としません。

trainImagesFile =“train-images-idx3-ubyte.gz”;testImagesFile =“t10k-images-idx3-ubyte.gz”;XTrain = processImagesMNIST(trainImagesFile);
读取MNIST图像数据…数据集中的图像数量:60000…
XTest = processImagesMNIST(testImagesFile);
读取MNIST图像数据…数据集中的图像数量:10000…

ネットワ,クア,キテクチャの定義

自己符号化器には,符号化器と復号化器の2の部分があります。符号化器は,イメージ入力を受け取り,畳み込みなどの一連のダウンサンプリング演算を使用して潜在ベクトル表現を出力(符号化)します。同様に,復号化器は潜在ベクトル表現を入力として受け取り,転置畳み込みなどの一連のアップサンプリング演算を使用して入力を再構成します。

入力をサンプリングするために,この例ではカスタム層samplingLayerを使用します。この層にアクセスするには,この例をラ。層は,対数分散ベクトル 日志 σ 2 と連結された平均ベクトル μ を入力として受け取り, N μ σ 2 から要素をサンプリングします。層は対数分散を使用して,学習プロセスをより数値的に安定させます。

符号化器ネットワ,クア,キテクチャの定義

28××28日1のイメージを16行1列の潜在ベクトルにダウンサンプリングする次の符号化器ネットワークを定義します。

  • 。デ,タは正規化しません。

  • 入力をダウンサンプリングするために,2次元畳み込み層とReLU層のブロックを2つ指定します。

  • 平均と対数分散の連結ベクトルを出力するために,潜在チャネル数の2倍の出力チャネル数をもつ全結合層を指定します。

  • 統計で指定された符号化をサンプリングするために,カスタム層samplingLayerを使用してサンプリング層を含めます。この層にアクセスするには,この例をラ。

numLatentChannels = 16;imageSize = [28 28 1];layersE = [imageInputLayer(imageSize,归一化=“没有”32岁的)convolution2dLayer(3填充=“相同”,Stride=2) relullayer卷积2dlayer(3,64,填充=“相同”,Stride=2) reluLayer fullyConnectedLayer(2*numLatentChannels) samplingLayer];

復号化器ネットワ,クア,キテクチャの定義

16行1列の潜在ベクトルから28××28日1のイメージを再構成する次の復号化器ネットワークを定義します。

  • 特徴ベクトル入力用に,潜在チャネルの数と一致する入力サ▪▪▪ズをも▪▪▪特徴入力層を指定します。

  • この例にサポトファルとして添付されているカスタム層projectAndReshapeLayerを使用し,潜在入力を7×7×64の配列に投影して形状変更します。この層にアクセスするには,この例をラ。[7,7,64]の投影サ@ @ズを指定します。

  • 入力をアップサンプリングするために,転置畳み込み層とReLU層のブロックを2指定します。

  • 28××28日1のサイズのイメージを出力するために,3行3列のフィルターを1つもつ転置畳み込み層を含めます。

  • 出力を[0,1]の範囲の値にマッピングするために,シグモescド活性化層を含めます。

projectionSize = [7 7 64];numInputChannels = size(imageSize,1);layersD = [featureInputLayer(numLatentChannels) projectAndReshapeLayer(projectionSize)转置conv2dlayer(3,64,裁剪=“相同”,Stride=2) reluLayer转置conv2dlayer(3,32,裁剪=“相同”,Stride=2) reluLayer转置conv2dlayer (3,numInputChannels,裁剪=“相同”) sigmoidLayer);

カスタム学習ル,プを使用して両方のネットワ,クに学習させ,自動微分を有効にするために,層配列をdlnetworkオブジェクトに変換します。

netE = dlnetwork(layersE);netD = dlnetwork(layersD);

モデル損失関数の定義

モデルの損失と,学習可能パラメタにいての損失の勾配を返す関数を定義します。

例においてモデル損失関数の節で定義されている関数modelLossは,符号化器ネットワークと復号化器ネットワーク,および入力データのミニバッチを入力として受け取り,ネットワーク内の学習可能パラメーターの損失と損失の勾配を返します。損失を計算するために,この関数は,例においてElbo損失関数の節で定義されている関数ELBOlossを使用し,符号化器によって出力された平均と対数分散を入力として受け取り,それらを使用して証拠下限(ELBO)損失を計算します。

学習オプションの指定

ミニバッチサesc escズを128,学習率を0.001として,30エポック学習させます。

numEpochs = 30;miniBatchSize = 128;learnRate = 1e-3;

モデルの学習

カスタム学習ル,プを使用してモデルに学習させます。

学習中に▪▪メ▪▪ジのミニバッチを処理および管理するminibatchqueueオブジェクトを作成します。各ミニバッチで次を行います。

  • 学習デ,タを配列デ,タストアに変換します。4番目の次元で反復するように指定します。

  • カスタムミニバッチ前処理関数preprocessMiniBatch(この例の最後で定義)を使用し,複数の観測値を単一のミニバッチに連結します。

  • イメージデータを次元ラベル“SSCB”(空间,空间,通道,批次)で書式設定します。既定では,minibatchqueueオブジェクトは,基となる型がdlarrayオブジェクトにデ,タを変換します。

  • Gpuが利用できる場合,Gpuで学習を行います。既定では,minibatchqueueオブジェクトは,gpuが利用可能な場合,各出力をgpuArrayに変換します。GPUを使用するには,并行计算工具箱™とサポートされているGPUデバイスが必要です。サポトされているデバスにいては,Gpu計算の要件(并行计算工具箱)を参照してください。

  • すべてのミニバッチが確実に同じサesc escズになるように,部分的なミニバッチをすべて破棄します。

dsTrain = arrayDatastore(XTrain,IterationDimension=4);numOutputs = 1;mbq = minibatchqueue(dsTrain,numOutputs,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”...PartialMiniBatch =“丢弃”);

亚当ソルバ,のパラメ,タ,を初期化します。

trailingAvgE = [];trailingAvgSqE = [];trailingAvgD = [];trailingAvgSqD = [];

学習の進行状況モニタ,用に合計反復回数を計算します。

numObservationsTrain = size(XTrain,4);numIterationsPerEpoch = ceil(numObservationsTrain / miniBatchSize);numIterations = nummepochs * numIterationsPerEpoch;

学習の進行状況モニタ,を初期化します。监控オブジェクトを作成するとタイマーが開始されるため,学習ループに近いところでオブジェクトを作成するようにしてください。

monitor = trainingProgressMonitor(...指标=“损失”...信息=“时代”...包含=“迭代”);

カスタム学習ル,プを使用してネットワ,クに学習させます。各エポックにいて,デタをシャッフルしてデタのミニバッチをルプで回します。各ミニバッチで次を行います。

  • 関数dlfevalおよびmodelLossを使用してモデルの損失と勾配を評価。

  • 関数adamupdateを使用して符号化器および復号化器のネットワ,クパラメ,タ,を更新。

  • 学習の進行状況を表示。

Epoch = 0;迭代= 0;%遍历epoch。epoch < numEpochs && ~monitor。停止epoch = epoch + 1;% Shuffle数据。洗牌(兆贝可);在小批上循环。Hasdata (mbq) && ~monitor。停止迭代=迭代+ 1;读取小批数据。X = next(mbq);评估损失和梯度。[loss,gradientsE,gradientsD] = dlfeval(@modelLoss,netE,netD,X);更新可学习参数。[netE,trailingAvgE,trailingAvgSqE] = adamupdate(netE, trailingAvgSqE)...gradientsE、trailingAvgE trailingAvgSqE,迭代,learnRate);[netD, trailingAvgD, trailingAvgSqD] = adamupdate(netD,...gradientsD、trailingAvgD trailingAvgSqD,迭代,learnRate);更新培训进度监视器。recordMetrics(监控、迭代损失=损失);updateInfo(监视、时代=时代+“的”+ numEpochs);班长。进度= 100*iteration/numIterations;结束结束

ネットワ,クのテスト

学習済みの自己符号化器を,ホ,ルドアウトされたテストセットでテストします。学習デ,タの場合と同じ手順を使用して,デ,タのミニバッチキュ,を作成します。ただし,デ,タの部分的なミニバッチは破棄しません。

dsTest = arrayDatastore(XTest,IterationDimension=4);numOutputs = 1;mbqTest = minibatchqueue(dsTest,numOutputs,...MiniBatchSize = MiniBatchSize,...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”);

関数modelPredictionsを使用し,学習済みの自己符号化器を使用して予測を行います。

YTest = modelforecasts (netE,netD,mbqTest);

テストイメージと再構成後のイメージの平均二乗誤差を取得し,それらをヒストグラムで可視化することで,再構成誤差を可視化します。

err = mean((XTest-YTest)。^2,[1 2 3]);图直方图(err) xlabel(“错误”) ylabel (“频率”)标题(“测试数据”

新しい▪▪メ▪▪ジの生成

ランダムにサンプリングされたメジ符号化を復号化器に渡して,新しいメジのバッチを生成します。

numImages = 64;ZNew = randn(numLatentChannels,numImages);ZNew = dlarray(ZNew,“CB”);YNew = predict(netD,ZNew);YNew = extractdata(YNew);

生成された▪▪メ▪▪ジを图に表示します。

图I = imtile(YNew);imshow (I)标题(“生成的图像”

ここでは,学習デ,タと同様の,メ,ジを生成できるように,vaeに強い特徴表現を学習させました。

補助関数

モデル損失関数

関数modelLossは,符号化器ネットワークと復号化器ネットワーク,および入力データのミニバッチを入力として受け取り,ネットワーク内の学習可能パラメーターの損失と損失の勾配を返します。この関数は,学習メジを符号化器に渡し,結果のメジ符号化を復号化器に渡します。損失を計算するために,この関数は,符号化器のサンプリング層によって出力された平均および対数分散統計を使って関数elboLossを使用します。

函数[loss,gradientsE,gradientsD] = modelLoss(netE,netD,X)%通过编码器转发。[Z,mu,logSigmaSq] = forward(netE,X);%通过解码器转发。Y = forward(netD,Z);计算损失和梯度。loss = elboLoss(Y,X,mu,logSigmaSq);[gradientsE,gradientsD] = dlgradient(loss,net . learnables,net . learnables);结束

Elbo損失関数

関数ELBOlossは,符号化器によって出力された平均と対数分散を受け取り,それらを使用して証拠下限(ELBO)損失を計算します。Elbo損失は,2の個別の損失項の和によって与えられます。

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

“再構成損失“は復号化器の出力が元の入力にどれだけ近いかを,平均二乗誤差(MSE)を使用して測定します。

重建 损失 均方误差 重建 图像 输入 图像

吉隆坡;この場合,KL損失の最小化によって,学習した平均と分散がターゲット(正規)分布にできる限り近づくようにします。サereplicationズ K の潜在次元にいて,kl損失は次のように取得されます。

吉隆坡 损失 - 0 5 1 K 1 + 日志 σ 2 - μ 2 - σ 2

KL損失項を含めることで,再構成の損失により学習したクラスターを潜在空間の中心の周りに密集させて,サンプリング元となる連続空間を構成するという実用的な効果が得られます。

函数损失= elboLoss(Y,T,mu,logSigmaSq)%重建损失。reconstructionLoss = mse(Y,T);% KL散度。KL = -0.5 * sum(1 + logSigmaSq - mu。^2 - exp(logSigmaSq),1);KL = mean(KL);%综合损失。损失=重建损失+ KL;结束

モデル予測関数

関数modelPredictionsは,符号化器と復号化器のネットワ,クオブジェクト,および入力デ,タのminibatchqueueオブジェクト兆贝可を入力として受け取り,minibatchqueueオブジェクトのすべてのデ,タを反復処理することでモデル予測を計算します。

函数Y = modelforecasts (netE,netD,mbq) Y = [];在小批上循环。hasdata(mbq) X = next(mbq);%通过编码器转发。Z = predict(netE,X);%通过解码器转发。XGenerated = predict(netD,Z);提取并连接预测。Y = cat(4,Y,extractdata(XGenerated));结束结束

ミニバッチ前処理関数

関数preprocessMiniBatchは,4番目の次元に沿って入力を連結することで,予測子のミニバッチを前処理します。

函数X = preprocessMiniBatch(dataX)%连接。X = cat(4,dataX{:});结束

参考文献

  1. LeCun, Y., C. Cortes,和C. J. C. Burges。“MNIST手写数字数据库。”http://yann.lecun.com/exdb/mnist/

参考

||||||

関連するトピック