敵対的生成ネットワク(gan)の学習
この例では,敵対的生成ネットワ。
敵対的生成ネットワーク(GAN)は深層学習ネットワークの一種で,入力された実データに類似した特性をもつデータを生成できます。
関数trainNetwork
はganの学習をサポトしていないため,カスタム学習ルプを実装しなければなりません。カスタム学習ルプを使用して甘に学習させるには,自動微分のためにdlarray
オブジェクトとdlnetwork
オブジェクトを使用できます。
甘は一緒に学習を行う2のネットワクで構成されています。
ジェネレーター——このネットワークは,乱数値(潜在入力)のベクトルを入力として与えられ,学習データと同じ構造のデータを生成します。
ディスクリミネディスクリミネタ。学習データとジェネレーターにより生成されたデータの両方の観測値を含むデータのバッチを与えられ,その観測値が
“真正的”
か“生成”
かの分類を試みます。
次の図は,ランダム入力のベクトルからイメージを生成するGANのジェネレーターネットワークを示しています。
次の図は,甘の構造を示しています。
甘に学習させる場合は,両方のネットワクの学習を同時に行うことで両者の性能を最大化します。
ジェネレタに学習させて,ディスクリミネタを"騙す"デタを生成。
ディスクリミネタに学習させて,実デタと生成デタを区別。
ジェネレーターの性能を最適化するために,生成データが与えられたときのディスクリミネーターの損失を最大化します。つまり,ジェネレーターの目的はディスクリミネーターが“真正的”
と分類するようなデタを生成することです。
ディスクリミネーターの性能を最適化するために,実データと生成データの両方のバッチが与えられたときのディスクリミネーターの損失を最小化します。。
これらの方法によって,いかにも本物らしいデータを生成するジェネレーターと,学習データの特性である強い特徴表現を学習したディスクリミネーターを得ることが理想的な結果です。
この例では、花の花デタセット[1]を使用して。
学習デタの読み込み
花のデタセット[1]をダウンロドし,解凍します。
url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);imageFolder = fullfile (downloadFolder,“flower_photos”);如果~存在(imageFolder“dir”) disp (“正在下载Flowers数据集(218 MB)…”) websave(文件名,url);解压(文件名,downloadFolder)结束
花の写真の邮箱メ邮箱ジデ邮箱タストアを作成します。
datasetFolder = fullfile (imageFolder);imd = imageDatastore (datasetFolder IncludeSubfolders = true);
デ64 x 64に変更します。
增量= imageDataAugmenter (RandXReflection = true);augimds = augmentedImageDatastore([64 64],imds,DataAugmentation=augmenter);
敵対的生成ネットワクの定義
甘は一緒に学習を行う2のネットワクで構成されています。
ジェネレーター——このネットワークは,乱数値(潜在入力)のベクトルを入力として与えられ,学習データと同じ構造のデータを生成します。
ディスクリミネディスクリミネタ。学習データとジェネレーターにより生成されたデータの両方の観測値を含むデータのバッチを与えられ,その観測値が
“真正的”
か“生成”
かの分類を試みます。
次の図は,甘の構造を示しています。
ジェネレタネットワクの定義
ランダムベクトルから。
このネットワクは,次を行います。
投影および形状変更操作を使用して,サイズ100のランダムベクトルを4×4×512の配列に変換。
バッチ正規化とReLU層を用いた一連の転置畳み込み層を使用して,結果の配列を64 x 64 x 3の配列にアップスケール。
このネットワクアキテクチャを層グラフとして定義し,次のネットワクプロパティを指定します。
転置畳み込み層では,各層のフィルター数を減らして5 x 5のフィルターを指定し,ストライドを2に指定し,各エッジでの出力のトリミングを指定します。
最後の転置畳み込み層では,生成されたイメージの3つのRGBチャネルに対応する3つの5 x 5のフィルターと,前の層の出力サイズを設定。
ネットワクの最後に,tanh層を追加。
ノopenstackズ入力を投影して形状変更するには,この例にサポopenstackトファopenstackルとして添付されている,カスタム層projectAndReshapeLayer
を使用します。この層にアクセスするには、この例をラ以及ブスクリプトとして開きます。
filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layersGenerator = [featureInputLayer(numLatentInputs) projectAndReshapeLayer(projectionSize,numLatentInputs) transposedConv2dLayer(filterSize,4*numFilters) batchNormalizationLayer reluLayer transposedConv2dLayer(filterSize,2*numFilters,Stride=2,剪裁= .“相同”(filterSize,numFilters,Stride=2,裁剪= .“相同”conver2dlayer (filterSize,3,Stride=2,裁剪=“相同”) tanhLayer);
カスタム学習ルプを使用してネットワクに学習させ,自動微分を有効にするには,層グラフをdlnetwork
オブジェクトに変換します。
netG = dlnetwork (layersGenerator);
ディスクリミネタネットワクの定義
64 × 64の実econf leメeconf leメ,econf le次のネットワ。
64 x 64 x 3のイメージを受け取り,バッチ正規化と漏ReLU層のある一連の畳み込み層を使用してスカラーの予測スコアを返すネットワークを作成します。ドロップアウトを使用して,入力ereplicationメ,ジにノereplicationズを追加します。
ドロップアウト層で,ドロップアウトの確率を0.5に設定。
畳み込み層で,5 × 5のフィルタ,を指定し,各層でフィルタ,数を増やす。また,ストラe .ドを2に指定し,出力のパディングを指定します。
漏漏ReLU層で,スケルを0.2に設定。
[0, 1]の範囲の確率を出力するために,4行4列のフィルターを1つもつ畳み込み層に続けてシグモイド層を指定。
dropoutProb = 0.5;numFilters = 64;规模= 0.2;inputSize = [64 64 3];filterSize = 5;layersDiscriminator = [imageInputLayer(inputSize, normalized = .“没有”) dropoutLayer (dropoutProb) convolution2dLayer (filterSize numFilters,跨步= 2,填充=“相同”) leakyReluLayer(规模)convolution2dLayer (2 * numFilters filterSize,跨步= 2,填充=“相同”) batchNormalizationLayer leakyReluLayer(scale) convolution2dLayer(filterSize,4*numFilters,Stride=2,Padding=“相同”) batchNormalizationLayer leakyReluLayer(scale) convolution2dLayer(filterSize,8*numFilters,Stride=2,Padding=“相同”) batchNormalizationLayer leakyReluLayer(scale) convolution2dLayer(4,1) sigmoidLayer];
カスタム学習ルプを使用してネットワクに学習させ,自動微分を有効にするには,層グラフをdlnetwork
オブジェクトに変換します。
= dlnetwork经济技术开发区(layersDiscriminator);
モデル損失関数の定義
この例のモデル損失関数の節にリストされている関数modelLoss
を作成します。この関数は,ジェネレーターおよびディスクリミネーターのネットワーク,入力データのミニバッチ,および乱数値と反転係数の配列を入力として受け取り,ネットワーク内の学習可能パラメーターについての損失値と損失値の勾配,ジェネレーターの状態,および2つのネットワークのスコアを返します。
学習オプションの指定
ミニバッチサ邮箱ズを128として500エポック学習させます。大きなデタセットでは,学習させるエポック数をこれより少なくできる場合があります。
numEpochs = 500;miniBatchSize = 128;
亚当最適化のオプションを指定します。両方のネットワクで次のように設定します。
学習率0.0002
勾配の減衰係数0.5
2乗勾配の減衰係数0.999
learnRate = 0.0002;gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999;
実イメージと生成イメージとを区別するディスクリミネーターの学習速度が速すぎる場合,ジェネレーターの学習に失敗する可能性があります。ディスクリミネーターとジェネレーターの学習バランスを改善するために,実イメージに割り当てられているラベルをランダムに反転させて実データにノイズを加えます。
0.35の確率で実ラベルを反転するように設定します。生成されたイメージにはすべて正しいラベルが付いているので,これがジェネレーターに損失を与えることはない点に注意してください。
flipProb = 0.35;
生成された検証邮箱メ邮箱ジを100回の反復ごとに表示します。
validationFrequency = 100;
モデルの学習
甘に学習させる場合は,両方のネットワクの学習を同時に行うことで両者の性能を最大化します。
ジェネレタに学習させて,ディスクリミネタを"騙す"デタを生成。
ディスクリミネタに学習させて,実デタと生成デタを区別。
ジェネレーターの性能を最適化するために,生成データが与えられたときのディスクリミネーターの損失を最大化します。つまり,ジェネレーターの目的はディスクリミネーターが“真正的”
と分類するようなデタを生成することです。
ディスクリミネーターの性能を最適化するために,実データと生成データの両方のバッチが与えられたときのディスクリミネーターの損失を最小化します。。
これらの方法によって,いかにも本物らしいデータを生成するジェネレーターと,学習データの特性である強い特徴表現を学習したディスクリミネーターを得ることが理想的な結果です。
minibatchqueue
を使用して、メ、ジのミニバッチを処理および管理します。各ミニバッチで次を行います。
カスタムミニバッチ前処理関数
preprocessMiniBatch
(この例の最後に定義)を使用して,ジを範囲[1]
で再スケリングします。指定したミニバッチサズ未満の観測値をも。
econメジデタを
“SSCB”
(空间,空间,渠道,批次)形式で書式設定します。既定では,minibatchqueue
オブジェクトは,基となる型が单
のdlarray
オブジェクトにデタを変換します。Gpuが利用できる場合,Gpuで学習を行います。既定では,
minibatchqueue
オブジェクトは,gpuが利用可能な場合,各出力をgpuArray
に変換します。GPU を使用するには、Parallel Computing Toolbox™ とサポートされている GPU デバイスが必要です。サポートされているデバイスについては、リリス別のgpuサポト(并行计算工具箱)を参照してください。
augimds。MiniBatchSize = MiniBatchSize;兆贝可= minibatchqueue (augimds,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”,...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”);
カスタム学習ルプを使用してモデルに学習させます。学習デタ全体をルプ処理し,各反復でネットワを更新します。学習の進行状況を監視するには,ホールドアウトされた乱数値の配列をジェネレーターに入力して得られた生成イメージのバッチと,スコアのプロットを表示します。
亚当最適化のパラメタを初期化します。
trailingAvgG = [];trailingAvgSqG = [];trailingAvg = [];trailingAvgSqD = [];
学習の進行状況を監視するには,ホールドアウトされたランダム固定ベクトルのバッチをジェネレーターに渡して得られた生成イメージのバッチを表示し,ネットワークのスコアをプロットします。
ホルドアウトされた乱数値の配列を作成します。
numValidationImages = 25;ZValidation = randn (numLatentInputs numValidationImages,“单身”);
デタをdlarray
オブジェクトに変換し,形式“CB”
(渠道、批量)を指定します。
ZValidation = dlarray (ZValidation,“CB”);
Gpuでの学習のために,デタをgpuArray
オブジェクトに変換します。
如果canUseGPU ZValidation = gpuArray(ZValidation);结束
学習の進行状況プロットを初期化します。图を作成して幅が2倍になるようサeconf econfズ変更します。
f =图;f.Position (3) = 2 * f.Position (3);
生成邮箱メ邮箱ジとネットワ邮箱クスコアのサブプロットを作成します。
imageAxes =情节(1、2、1);scoreAxes =情节(1、2、2);
スコアのプロット用にアニメションの線を初期化します。
C = colororder;lineScoreG = animatedline (scoreAxes颜色= C (1:));lineScoreD = animatedline (scoreAxes颜色= C (2:));传奇(“发电机”,“鉴频器”);ylim([0 1])包含(“迭代”) ylabel (“分数”网格)在
甘に学習させます。各エポックで,デ。
各ミニバッチで次を行います。
関数
dlfeval
と関数modelLoss
を使用して,学習可能なパラメーターについての損失の勾配,ジェネレーターの状態,およびネットワークのスコアを評価。関数
adamupdate
を使用してネットワクパラメタを更新。2のネットワクのスコアをプロット。
validationFrequency
回の反復が終わるごとに,ホ。
学習を行うのに時間がかかる場合があります。
迭代= 0;开始=抽搐;循环遍历各个时代。为时代= 1:numEpochs重置和洗牌数据存储。洗牌(兆贝可);在小批量上循环。而Hasdata (mbq)迭代=迭代+ 1;读取小批数据。X =下一个(兆贝可);为发电机网络生成潜在输入。转换为% dlarray并指定格式“CB”(通道,批处理)。如果GPU是%可用,然后将潜在输入转换为gpuArray。Z = randn (numLatentInputs miniBatchSize,“单身”);Z = dlarray (Z,“CB”);如果canUseGPU Z = gpuArray(Z);结束评估损失相对于可学习内容的梯度。%参数、生成器状态和使用的网络评分% dlfeval和modelLoss函数。[~, ~, gradientsG、gradientsD stateG, scoreG,得分)=...dlfeval (@modelLoss netG,经济技术开发区X, Z, flipProb);netG。状态= stateG;更新鉴别器网络参数。[netD,trailingAvg,trailingAvgSqD] = adamupdate(netD, gradientsD,...trailingAvg trailingAvgSqD,迭代,...learnRate、gradientDecayFactor squaredGradientDecayFactor);更新发电机网络参数。[netG,trailingAvgG,trailingAvgSqG] = adamupdate(netG, gradientsG,...trailingAvgG trailingAvgSqG,迭代,...learnRate、gradientDecayFactor squaredGradientDecayFactor);%每个validationFrequency迭代,显示批量生成%的图像使用hold out生成器输入。如果mod(迭代,validationFrequency) == 0 ||迭代== 1使用hold out生成器输入生成图像。XGeneratedValidation =预测(netG ZValidation);%平铺并缩放范围为[0 1]的图像。我= imtile (extractdata (XGeneratedValidation));I =重新调节(我);显示图片。次要情节(1、2、1);图像(imageAxes,我)xticklabels ([]);yticklabels ([]);标题(“生成的图像”);结束更新分数图。subplot(1,2,2) scoreG = double(extractdata(scoreG));addpoints (lineScoreG迭代,scoreG);得分=双(extractdata(得分));addpoints (lineScoreD迭代,得分);用培训进度信息更新标题。。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);标题(...”时代:“+时代+”、“+...“迭代:“+迭代+”、“+...”经过:“+ drawnow字符串(D))结束结束
ここでは,ディスクリミネーターは生成イメージの中から実イメージを識別する強い特徴表現を学習しました。次に,ジェネレーターは,学習データと同様のイメージを生成できるように,同様に強い特徴表現を学習しました。
学習プロットは,ジェネレタ。ネットワクのスコアを解釈する方法の詳細にいては,甘の学習過程の監視と一般的な故障モドの識別を参照してください。
新しい邮箱メ邮箱ジの生成
新しいジを生成するには,ジェネレ预测
を使用して,ランダムベクトルのバッチを含むdlarray
オブジェクトを指定します。帐号メ帐号ジを並べて表示するには関数imtile
を使用し,関数重新调节
を使って邮箱メ邮箱ジを再スケ邮箱リングします。
ジェネレタネットワクに入力するランダムベクトル25個のバッチを含むdlarray
オブジェクトを作成します。
numObservations = 25;ZNew = randn (numLatentInputs numObservations,“单身”);ZNew = dlarray (ZNew,“CB”);
Gpuが利用可能な場合は,潜在ベクトルをgpuArray
に変換します。
如果canUseGPU ZNew = gpuArray(ZNew);结束
関数预测
をジェネレタと入力デタと共に使用して,新しい。
XGeneratedNew =预测(netG ZNew);
帐号メ帐号ジを表示します。
我= imtile (extractdata (XGeneratedNew));I =重新调节(我);数字图像(I)轴从标题(“生成的图像”)
モデル損失関数
関数modelLoss
は,ジェネレタおよびディスクリミネタのdlnetwork
オブジェクトであるnetG
とnetD
,入力デタのミニバッチX
,乱数値の配列Z
,および実ラベルの反転する確率flipProb
を入力として受け取り,ネットワーク内の学習可能パラメーターについての損失値と損失値の勾配,ジェネレーターの状態,および2つのネットワークのスコアを返します。
函数[lossG, lossD gradientsG、gradientsD stateG, scoreG,得分)=...modelLoss (netG,经济技术开发区X, Z, flipProb)用鉴别器网络对真实数据进行预测。。YReal =前进,经济技术开发区(X);用鉴别器计算生成数据的预测。%网络。向前(XGenerated stateG] = (netG, Z);YGenerated =前进(,经济技术开发区XGenerated);计算鉴别器的得分。。scores =(均值(YReal) +均值(1-YGenerated)) / 2;计算生成器的分数。scoreG =意味着(YGenerated);随机翻转真实图片的标签。numObservations =大小(YReal 4);idx = rand(1,numObservations) < flipProb;YReal(:,:,:,idx) = 1 - YReal(:,:,:,idx);%计算GAN损耗。[lossG, lossD] = ganLoss(YReal,YGenerated);对于每个网络,计算有关损失的梯度。。gradientsG = dlgradient (lossG、netG.Learnables RetainData = true);gradientsD = dlgradient (lossD netD.Learnables);结束
甘の損失関数とスコア
ジェネレタの目的はディスクリミネタが“真正的”
と分類するようなデタを生成することです。ジェネレーターが生成したイメージをディスクリミネーターが実データとして分類する確率を最大化するには,負の対数尤度関数を最小化します。
ディスクリミネタの出力 が与えられた場合,次のようになります。
は、入力
“真正的”
に属する確率です。は、入力
“生成”
に属する確率です。
ジェネレタの損失関数は次の式で表されます。
ここで, は生成。
ディスクリミネタの目的はジェネレタに"騙されない"ことです。ディスクリミネーターが実イメージと生成イメージを正しく区別する確率を最大化するには,対応する負の対数尤度関数の和を最小化します。
ディスクリミネタの損失関数は次の式で表されます。
ここで, は実。
ジェネレーターとディスクリミネーターがそれぞれの目標をどれだけ達成するかを0から1のスケールで測定するには,スコアの概念を使用できます。
ジェネレタのスコアは,生成の出力に対応する確率の平均です。
ディスクリミネーターのスコアは,実イメージと生成イメージの両方に対するディスクリミネーターの出力に対応する確率の平均です。
スコアは損失に反比例しますが,実質的には同じ情報を表しています。
函数[lossG, lossD] = ganLoss (YReal YGenerated)计算鉴别器网络的损失。lossD = -mean(log(YReal)) -mean(log(1-YGenerated));计算发电机网络的损耗。lossG =意味着(日志(YGenerated));结束
ミニバッチ前処理関数
関数preprocessMiniBatch
は,次の手順でデタを前処理します。
入力cell配列から。
帐号メ帐号ジの範囲が
[1]
となるように再スケリングします。
函数X = preprocessMiniBatch(数据)%连接mini-batchX =猫(4、数据{:});%重新缩放范围[-1]内的图像。X =重新调节(X, 1, 1, InputMin = 0, InputMax = 255);结束
参考文献
TensorFlow团队。花http://download.tensorflow.org/example_images/flower_photos.tgz
雷德福,亚历克,卢克·梅茨,还有索史密斯·钦塔拉。用深度卷积生成对抗网络进行无监督表示学习。预印本,2015年11月19日提交。http://arxiv.org/abs/1511.06434。
参考
dlnetwork
|向前
|预测
|dlarray
|dlgradient
|dlfeval
|adamupdate
|minibatchqueue