主要内容

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

敵対的生成ネットワ,ク(gan)の学習

この例では、敵対的生成ネットワ、クに学習させて、メ、ジを生成する方法を説明します。

敵対的生成ネットワーク(GAN)は深層学習ネットワークの一種で,入力された実データに類似した特性をもつデータを生成できます。

Ganは一緒に学習を行う2のネットワクで構成されています。

  1. ジェネレーター——このネットワークは,乱数値(潜在入力)のベクトルを入力として与えられ,学習データと同じ構造のデータを生成します。

  2. ディスクリミネタ。学習データとジェネレーターにより生成されたデータの両方の観測値を含むデータのバッチを与えられ,その観測値が“真正的”“生成”かの分類を試みます。

Ganに学習させる場合は,両方のネットワ,クの学習を同時に行うことで両者の性能を最大化します。

  • ジェネレタに学習させて,ディスクリミネタを“騙す”デタを生成。

  • ディスクリミネ,タ,に学習させて,実デ,タと生成デ,タを区別。

ジェネレーターの性能を最適化するために,生成データが与えられたときのディスクリミネーターの損失を最大化します。つまり,ジェネレーターの目的はディスクリミネーターが“真正的”と分類するようなデ,タを生成することです。

ディスクリミネーターの性能を最適化するために,実データと生成データの両方のバッチが与えられたときのディスクリミネーターの損失を最小化します。“騙されない”ことです。

これらの方法によって,いかにも本物らしいデータを生成するジェネレーターと,学習データの特性である強い特徴表現を学習したディスクリミネーターを得ることが理想的な結果です。

学習デ,タの読み込み

のデ,タセット[1]をダウンロ,ドし,解凍します。

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile(下载文件夹,“flower_dataset.tgz”);imageFolder = fullfile(下载文件夹,“flower_photos”);如果~存在(imageFolder“dir”) disp ("正在下载Flowers数据集(218 MB)…") websave(文件名,url);解压(文件名,downloadFolder)结束

花の写真のメジデタストアを作成します。

datasetFolder = fullfile(imageFolder);imds = imageDatastore(datasetFolder, inclesubfolders =true);

デ,タを拡張して水平方向にランダムに反転させ,ズを64 × 64に変更します。

augmenter = imageDataAugmenter(RandXReflection=true);augimds = augmentedImageDatastore([64 64],imds,DataAugmentation=augmenter);

ジェネレ,タ,ネットワ,クの定義

100年サイズのランダムベクトルからイメージを生成するネットワークアーキテクチャを以下のように定義します。

このネットワ,クは,次を行います。

  • 全結合層とそれに続く形状変更操作を使用して,サイズ100のランダムベクトルを7 x 7 x 128の配列に変換します。

  • バッチ正規化とReLU層を用いた一連の転置畳み込み層を使用して,結果の配列を64 x 64 x 3の配列にスケールアップ。

このネットワ,クア,キテクチャを層グラフとして定義し,次のネットワ,クプロパティを指定します。

  • 転置畳み込み層では,各層のフィルター数を減らして5 x 5のフィルターを指定し,ストライドを2に指定し,各エッジでの出力のトリミングを指定します。

  • 最後の転置畳み込み層では,生成されたイメージの3つのRGBチャネルに対応する3つの5 x 5のフィルターと,前の層の出力サイズを設定。

  • ネットワ,クの最後に,tanh層を追加。

ノイズ入力を投影して形状変更するには,全結合層に続けて,形状変更操作(この例にサポートファイルとして添付されている関数feature2imageの出力である関数を使用する関数層として指定)を使用します。この関数にアクセスするには,この例をラ。

filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layersGenerator = [featureInputLayer(numLatentInputs) fullyConnectedLayer(prod(projectionSize)) functionLayer(@(X) feature2image(X,projectionSize),Formattable=true) transposedConv2dLayer(filterSize,4*numFilters) batchNormalizationLayer reluLayer transposedConv2dLayer(filterSize,2*numFilters,Stride=2,裁剪=“相同”) batchNormalizationLayer reluLayer转置conv2dlayer (filterSize,numFilters,Stride=2,裁剪=“相同”) batchNormalizationLayer relullayer转置conv2dlayer (filterSize,3,Stride=2,裁剪=“相同”) tanhLayer);lgraphGenerator = layerGraph(layergenerator);

カスタム学習ル,プを使用してネットワ,クに学習させ,自動微分を有効にするには,層グラフをdlnetworkオブジェクトに変換します。

dlnetGenerator = dlnetwork(lgraphGenerator);

ディスクリミネ,タ,ネットワ,クの定義

64 × 64の実メジと生成メジを分類する,次のネットワクを定義します。

64 x 64 x 3のイメージを受け取り,バッチ正規化と漏ReLU層のある一連の畳み込み層を使用してスカラーの予測スコアを返すネットワークを作成します。ドロップアウトを使用して,入力@ @ @ジにノ@ @ @ @ @ @ @

  • ドロップアウト層で,ドロップアウトの確率を0.5に設定。

  • 畳み込み層で,5 × 5のフィルタ,を指定し,各層でフィルタ,数を増やす。また,ストラaaplドを2に指定し,出力のパディングを指定します。

  • 泄漏ReLU層で,スケ,ルを0.2に設定。

  • 最後の層で,4 × 4のフィルタを1も畳み込み層を設定。

[0,1]の範囲の確率を出力するには,例のモデル勾配関数の節にリストされている関数modelGradientsの関数乙状结肠を使用します。

dropoutProb = 0.5;numFilters = 64;量表= 0.2;inputSize = [64 64 3];filterSize = 5;layersDiscriminator = [imageInputLayer(inputSize,归一化=“没有”) dropoutLayer(dropoutProb) convolution2dLayer(filterSize,numFilters,Stride=2,Padding=“相同”) leakyReluLayer(scale) convolution2dLayer(filterSize,2*numFilters,Stride=2,Padding=“相同”) 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)];lgraphDiscriminator = layerGraph(layersDiscriminator);

カスタム学習ル,プを使用してネットワ,クに学習させ,自動微分を有効にするには,層グラフをdlnetworkオブジェクトに変換します。

dlnetDiscriminator = dlnetwork(lgraphDiscriminator);

モデル勾配と損失関数の定義

例のモデル勾配関数の節にリストされている関数modelGradientsを作成します。この関数は,ジェネレーターネットワークおよびディスクリミネーターネットワーク,入力データのミニバッチ,および乱数値と反転係数の配列を入力として受け取り,ネットワーク内の学習可能パラメーターについての損失の勾配と,2つのネットワークのスコアを返します。

学習オプションの指定

ミニバッチサesc escズを128として500エポック学習させます。大きなデ,タセットでは,学習させるエポック数をこれより少なくできる場合があります。

numEpochs = 500;miniBatchSize = 128;

亚当最適化のオプションを指定します。両方のネットワ,クで次のように設定します。

  • 学習率0.0002

  • 勾配の減衰係数0.5

  • 2乗勾配の減衰係数0.999

learnRate = 0.0002;gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999;

実イメージと生成イメージとを区別するディスクリミネーターの学習速度が速すぎる場合,ジェネレーターの学習に失敗する可能性があります。ディスクリミネーターとジェネレーターの学習バランスを改善するために,ラベルをランダムに反転させて実データにノイズを加えます。

実ラベルの30%(ラベル全体の15%)を反転するには,flipFactorの値を0.3に指定します。生成されたイメージにはすべて正しいラベルが付いているので,これがジェネレーターに損失を与えることはない点に注意してください。

flipFactor = 0.3;

生成された検証@ @メ@ @ジを100回の反復ごとに表示します。

validationFrequency = 100;

モデルの学習

minibatchqueueを使用して,。各ミニバッチで次を行います。

  • カスタムミニバッチ前処理関数preprocessMiniBatch(この例の最後に定義)を使用して,メジを範囲[1]で再スケ,リングします。

  • 観測値が128個未満の部分的なミニバッチは破棄します。

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

  • Gpuが利用できる場合,Gpuで学習を行います。minibatchqueueOutputEnvironmentオプションが“汽车”のとき,gpuが利用可能であれば,minibatchqueueは各出力をgpuArrayに変換します。GPU を使用するには、Parallel Computing Toolbox™、および Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU が必要です。

augimds。MiniBatchSize = MiniBatchSize;executionEnvironment =“汽车”;MBQ = minibatchqueue(增加,...MiniBatchSize = MiniBatchSize,...PartialMiniBatch =“丢弃”...MiniBatchFcn = @preprocessMiniBatch,...MiniBatchFormat =“SSCB”...OutputEnvironment = executionEnvironment);

カスタム学習ル,プを使用してモデルに学習させます。学習デ,タ全体をル,プ処理し,各反復でネットワ,クパラメ,タ,を更新します。学習の進行状況を監視するには,ホールドアウトされた乱数値の配列をジェネレーターに入力して得られた生成イメージのバッチと,スコアのプロットを表示します。

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

trailingAvgGenerator = [];trailingAvgSqGenerator = [];trailingAvgDiscriminator = [];trailingAvgSqDiscriminator = [];

学習の進行状況を監視するには,ホールドアウトされたランダム固定ベクトルのバッチをジェネレーターに渡して得られた生成イメージのバッチを表示し,ネットワークのスコアをプロットします。

ホ,ルドアウトされた乱数値の配列を作成します。

numValidationImages = 25;ZValidation = randn(numLatentInputs,numValidationImages,“单身”);

デタをdlarrayオブジェクトに変換し,次元ラベル“CB”(channel, batch)を指定します。

dlZValidation = dlarray(ZValidation,“CB”);

Gpuでの学習のために,デ,タをgpuArrayオブジェクトに変換します。

如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZValidation = gpuArray(dlZValidation);结束

学習の進行状況プロットを初期化します。图を作成して幅が2倍になるようサescズ変更します。

F =数字;f.Position(3) = 2*f.Position(3);

生成メジとネットワクスコアのサブプロットを作成します。

imageAxes = subplot(1,2,1);scoreAxes = subplot(1,2,2);

スコアのプロット用にアニメ,ションの線を初期化します。

lineScoreGenerator = animatedline(scoreAxes,Color=[0 0.447 0.741]);lineScoreDiscriminator = animatedline(scoreAxes,Color=[0.85 0.325 0.098]);传奇(“发电机”“鉴频器”);Ylim ([0 1]) xlabel(“迭代”) ylabel (“分数”网格)

Ganに学習させます。各エポックで,デタストアをシャッフルしてデタのミニバッチにいてルプします。

各ミニバッチで次を行います。

  • 関数dlfevalおよびmodelGradientsを使用してモデルの勾配を評価します。

  • 関数adamupdateを使用してネットワ,クパラメ,タ,を更新。

  • 2 .のネットワ,クのスコアをプロット。

  • validationFrequencyの反復がすべて終了した後で,ホールドアウトされた固定ジェネレーター入力の生成イメージのバッチを表示。

学習を行うのに時間がかかる場合があります。

迭代= 0;开始= tic;%遍历epoch。epoch = 1:numEpochs重置和洗牌数据存储。洗牌(兆贝可);在小批上循环。Hasdata (mbq)迭代=迭代+ 1;读取小批数据。dlX = next(mbq);为发电机网络生成潜在输入。转换为% darray,并指定尺寸标签“CB”(通道,批)。%如果在GPU上训练,则将潜在输入转换为gpuArray。Z = randn(numLatentInputs,miniBatchSize,“单身”);dlZ = dlarray(Z,“CB”);如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZ = gpuArray(dlZ);结束使用评估模型梯度和发电机状态的末尾列出的modelGradients函数%的例子。[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...dlfeval(@modelGradients, dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor);dlnetGenerator。状态=状态生成器;更新鉴别器网络参数。[dlnetDiscriminator, trailingAvgDiscriminator trailingAvgSqDiscriminator] =...adamupdate (dlnetDiscriminator gradientsDiscriminator,...trailingAvgDiscriminator, trailingAvgSqDiscriminator,迭代,...learnRate, gradientDecayFactor, squaredGradientDecayFactor);更新发电机网络参数。[dlnetGenerator, trailingAvgGenerator trailingAvgSqGenerator] =...adamupdate (dlnetGenerator gradientsGenerator,...trailingAvgGenerator, trailingAvgSqGenerator,迭代,...learnRate, gradientDecayFactor, squaredGradientDecayFactor);%每次验证频率迭代,显示批生成的图像使用%保留的发电机输入。如果mod(迭代,validationFrequency) == 0 ||迭代== 1使用保留的生成器输入生成图像。dlXGeneratedValidation = predict(dlnetGenerator,dlZValidation);平铺和重新缩放范围[0 1]的图像。I = imtile(extractdata(dlXGeneratedValidation));I = rescale(I);显示图片。次要情节(1、2、1);图像(imageAxes,我)xticklabels ([]);yticklabels ([]);标题(“生成的图像”);结束更新分数图。次要情节(1、2、2)addpoints (lineScoreGenerator,迭代,...双(收集(extractdata (scoreGenerator))));addpoints (lineScoreDiscriminator迭代,...双(收集(extractdata (scoreDiscriminator))));用培训进度信息更新标题。。D = duration(0,0,toc(start),Format=“hh: mm: ss”);标题(...”时代:“+ epoch +”、“+...“迭代:“+迭代+”、“+...”经过:“+字符串(D))现在绘制结束结束

ここでは,ディスクリミネーターは生成イメージの中から実イメージを識別する強い特徴表現を学習しました。次に,ジェネレーターは,学習データと同様のイメージを生成できるように,同様に強い特徴表現を学習しました。

学習プロットは,ジェネレタおよびディスクリミネタのネットワクのスコアを示しています。ネットワクのスコアを解釈する方法の詳細にいては,Ganの学習過程の監視と一般的な故障モ,ドの識別を参照してください。

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

新しいメジを生成するには,ジェネレタに対して関数预测を使用して,ランダムベクトルのバッチを含むdlarrayオブジェクトを指定します。メ,ジを並べて表示するには関数imtileを使用し,関数重新调节を使ってメジを再スケリングします。

ジェネレ,タ,ネットワ,クに入力するランダムベクトル25個のバッチを含むdlarrayオブジェクトを作成します。

numObservations = 25;ZNew = randn(numLatentInputs,numObservations,“单身”);dlZNew = dlarray(ZNew,“CB”);

Gpuを使用してaapl . exe,デaapl . exe,デaapl . exegpuArrayオブジェクトにも変換します。

如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZNew = gpuArray(dlZNew);结束

関数预测をジェネレタと入力デタと共に使用して,新しいメジを生成します。

dlXGeneratedNew = predict(dlnetGenerator,dlZNew);

メ,ジを表示します。

I = imtile(extractdata(dlXGeneratedNew));I = rescale(I);图像(I)轴标题(“生成的图像”

モデル勾配関数

関数modelGradientsは,ジェネレ,タ,およびディスクリミネ,タ,のdlnetworkオブジェクトであるdlnetGeneratordlnetDiscriminator,入力デ,タのミニバッチdlX,乱数値の配列dlZ,および実ラベルの反転する割合flipFactorを入力として受け取り,ネットワーク内の学習可能パラメーターについての損失の勾配,ジェネレーターの状態,および2つのネットワークのスコアを返します。ディスクリミネ,タ,の出力は範囲[0,1]に含まれないため,関数modelGradientsはシグモ@ @ド関数を適用してこれを確率に変換します。

函数[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...modelGradients(dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor)用鉴别器网络计算真实数据的预测。。dlYPred = forward(dlnetDiscriminator, dlX);用鉴别器网络计算生成数据的预测。[dlXGenerated,stateGenerator] = forward(dlnetGenerator,dlZ);dlYPredGenerated = forward(dlnetDiscriminator, dlXGenerated);将鉴别器输出转换为概率。probGenerated = sigmoid(dlYPredGenerated);probReal = sigmoid(dlYPred);计算鉴别器的分数。scoreDiscriminator = (mean(probReal) + mean(1-probGenerated)) / 2;计算发电机的得分。scoreGenerator = mean(probGenerated);随机翻转真实图像标签的一小部分。numObservations = size(probReal,4);idx = randperm(numObservations,floor(flipFactor * numObservations));把标签翻过来。probReal(:,:,:,idx) = 1 - probReal(:,:,:,idx);计算GAN损耗。[lossGenerator, lossDiscriminator] = ganLoss(probReal,probGenerated);对于每个网络,计算与损失相关的梯度。gradientsGenerator = dlgradient(lossGenerator, dlnetGenerator.Learnables,RetainData=true);gradientsDiscriminator = dlgradient(lossDiscriminator, dlnetDiscriminator.Learnables);结束

Ganの損失関数とスコア

ジェネレ,タ,の目的はディスクリミネ,タ,が“真正的”と分類するようなデ,タを生成することです。ジェネレーターが生成したイメージをディスクリミネーターが実データとして分類する確率を最大化するには,負の対数尤度関数を最小化します。

ディスクリミネ,タ,の出力 Y が与えられた場合,次のようになります。

  • Y ˆ σ Y は,入力“真正的”に属する確率です。

  • 1 - Y ˆ は,入力“生成”に属する確率です。

シグモ@ @ド演算 σ は関数modelGradientsで行われる点に注意してください。ジェネレ,タ,の損失関数は次の式で表されます。

lossGenerator - 的意思是 日志 Y ˆ 生成的

ここで, Y ˆ G e n e r 一个 t e d は生成メジに対するディスクリミネタの出力確率を表しています。

ディスクリミネタの目的はジェネレタに“騙されない”ことです。ディスクリミネーターが実イメージと生成イメージを正しく区別する確率を最大化するには,対応する負の対数尤度関数の和を最小化します。

ディスクリミネ,タ,の損失関数は次の式で表されます。

lossDiscriminator - 的意思是 日志 Y ˆ 真正的 - 的意思是 日志 1 - Y ˆ 生成的

ここで, Y ˆ R e 一个 l は実メジに対するディスクリミネタの出力確率を表しています。

ジェネレーターとディスクリミネーターがそれぞれの目標をどれだけ達成するかを0から1のスケールで測定するには,スコアの概念を使用できます。

ジェネレタのスコアは,生成メジに対するディスクリミネタの出力に対応する確率の平均です。

scoreGenerator 的意思是 Y ˆ 生成的

ディスクリミネーターのスコアは,実イメージと生成イメージの両方に対するディスクリミネーターの出力に対応する確率の平均です。

scoreDiscriminator 1 2 的意思是 Y ˆ 真正的 + 1 2 的意思是 1 - Y ˆ 生成的

スコアは損失に反比例しますが,実質的には同じ情報を表しています。

函数[lossGenerator, lossDiscriminator] = ganLoss(probReal,probGenerated)计算鉴别器网络的损失。lossDiscriminator = -mean(log(probReal)) -mean(log(1-probGenerated));计算发电机网络的损失。lossGenerator = -mean(log(probGenerated));结束

ミニバッチ前処理関数

関数preprocessMiniBatchは,次の手順でデ,タを前処理します。

  1. 入力cell配列からメジデタを抽出して数値配列に連結します。

  2. メ,ジの範囲が[1]となるように再スケ,リングします。

函数X = preprocessMiniBatch(数据)连接迷你批X = cat(4,data{:});重新缩放范围为[-1 1]的图像。(X,-1,1,InputMin=0,InputMax=255);结束

参考文献

  1. TensorFlow团队。http://download.tensorflow.org/example_images/flower_photos.tgz

  2. 雷德福,亚历克,卢克·梅茨,还有南史密斯·钦塔拉。深度卷积生成对抗网络的无监督表示学习预印本,提交于2015年11月19日。http://arxiv.org/abs/1511.06434。

参考

|||||||

関連するトピック