主要内容

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

敌対的生成ネットワーク(GaN)の学习

この例では,敌対的生成ネットワーク(gan)に学习させて生成する方法をを明します。

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

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

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

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

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

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

  • ディスクリミネーターに学习させ,実データと生成データを。

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

ディスクリミネーターのの性能を最适最适するに,実データと生成データの両のが与えられたのディスクリミネーターのをを最つまりつまりつまりししししににににににににににににににににににれ“ことです。

これらの方法によって,十分に现実的なデータ生成するジェネレーターと,学校データの特性强い特徴表现を学习しディスクリミネーターをことことがしたディスクリミネーター得ることががし结果结果结果结果

学習データの読み込み

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

url ='http://download.tensorflow.org/example_images/flower_photos.tgz';downloadfolder = tempdir;filename = fullfile(downloadFolder,'flower_dataset.tgz');imageFolder = fullfile (downloadFolder,“flower_photos”);如果〜存在(imagefolder,“dir”)disp("下载花卉资料集(2180mb)…")Websave(Filename,URL);Untar(文件名,DownloadFolder)结尾

花病作作作作者:王莹

datasetfolder = fullfile(imagefolder);imds = imageageataStore(DataSetFolder,......'insertumbfolders',真正的);

データを拡張して水平方向にランダムに反転させ,イメージのサイズを64 x 64に変更します。

upmmenter = imagedataAugmenter(“RandXReflection”,真正的);= augmentedImageDatastore([64 64],imds,'dataaugmentation'、增压器);

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

介绍値の1 x 1 x 100の配列からイメージ生成するネットワークアーキテクチャを以のに定义します。

このネットワークは,次次行い。

  • “投影形状変更“層を使用して,ノイズで構成される1 x 1 x 100の配列を7 x 7 x 128の配列に変換。

  • バッチ正式化とrelu层を用作た连の転置层を使し,结果结果配列を64 x 64 x 3のににスケールアップスケールアップ。

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

  • 転置畳み込み层では,5 x 5のフィルター指定し,各层でで数を,ストライドを2にし,ストライドをエッジのをトリミングするに设定。

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

  • ネットワークネットワークの最后,tanh层を追加。

ノイズノイズ力量を投影し形状変更変更には,この例にサポートとしてとして添付れている,カスタム层projectAndReshapeLayerを使用します。projectAndReshapeLayer层は,全结合演算をして入をし,出力を指定に形状形状ししし変更ししし

filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layersGenerator = [imageInputLayer([1 1 numLatentInputs],“归一化”'没有任何''名称''在')ProjectAndreshapelayer(Projectionsize,NumlattentInputs,'proj');TransposedConv2dlayer(过滤,4 * NumFilters,'名称''tconv1') batchNormalizationLayer ('名称'“bnorm1”)剥离('名称'“relu1”) transposedConv2dLayer (2 * numFilters filterSize,'走吧'2,“种植”'相同的''名称''tconv2') batchNormalizationLayer ('名称'“bnorm2”)剥离('名称''relu2') transposedConv2dLayer (filterSize numFilters,'走吧'2,“种植”'相同的''名称''tconv3') batchNormalizationLayer ('名称'“bnorm3”)剥离('名称''relu3')TransposedConv2dlayer(过滤,3,'走吧'2,“种植”'相同的''名称'“tconv4”) tanhLayer ('名称''tanh'));lgraphGenerator = layerGraph (layersGenerator);

カスタム学习ループを使使してに学习习せ,自动分子を有象にには,层グラフをdlnetworkオブジェクトに変换します。

dlnetGenerator = dlnetwork (lgraphGenerator);

ディスクリミネーターネットワークの定义

64 x 64の実イメージと生成イメージを分类する,次のネットワークを定义し。

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

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

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

  • 漏水的ReLU層で,スケールを0.2に設定。

  • 最后の层で,4 x 4のフィルターを1つもつ畳み込み层を。

范囲[0,1]の确率をを力するにははは,モデル勾配関数の关节乙状结肠をを用します

dropoutprob = 0.5;numFilters = 64;Scale = 0.2;InputSize = [64 64 3];filterSize = 5;LayersDiscriminator = [ImageInputLayer(输入,“归一化”'没有任何''名称''在') dropoutLayer (0.5,'名称'“辍学”) convolution2dLayer (filterSize numFilters,'走吧'2,“填充”'相同的''名称''conv1')漏髓范围(秤,'名称'“lrelu1”) convolution2dLayer (2 * numFilters filterSize,'走吧'2,“填充”'相同的''名称''conv2') batchNormalizationLayer ('名称''bn2')漏髓范围(秤,'名称'“lrelu2”)卷积2dlayer(过滤,4 * numfilters,'走吧'2,“填充”'相同的''名称''conv3') batchNormalizationLayer ('名称''bn3')漏髓范围(秤,'名称'“lrelu3”)卷积2dlayer(过滤,8 * numfilters,'走吧'2,“填充”'相同的''名称''conv4') batchNormalizationLayer ('名称''bn4')漏髓范围(秤,'名称'“lrelu4”)卷积2dlayer(4,1,'名称''conv5'));lgraphDiscriminator = layerGraph (layersDiscriminator);

カスタム学习ループを使使してに学习习せ,自动分子を有象にには,层グラフをdlnetworkオブジェクトに変换します。

dlnetdiscriminator = dlnetwork(lgraphdiscriminator);

モデル勾配,损失关联,およびスコアの定义

例のモデル勾配関数の節にリストされている関数modelGradientsを作用成し。附近,ジェネレータージェネレーターおよびディスクリミネーター,入力データのミニバッチ,およびおよび値値反転系のををとして受け取り,ネットワーク内の习受け取りなについての损失勾配となについて损失つつのネットワークののスコアを返し返し

学习オプションの指定

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

numepochs = 500;minibatchsize = 128;

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

  • 学习0.0002

  • 勾配の减衰减衰码0.5

  • 2乘勾配の减衰码0.999

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

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

実ラベルの30%を反転するするに指定ますます。これこれ,ラベルラベル総ののことを意味し反転するを意味します。生成さたイメージははすべてラベルが付いいるはすべて正式これがジェネレータージェネレーターに损失损失与えることはない点にに注意して

flipfactor = 0.3;

验证频率= 100;

モデルの学习

小公子をを使て,イメージイメージのミニバッチをををおよびしししいいいいいしししいいい

  • カスタムミニバッチ前処理関数Preprocessminibatch.(この例の最后に定义)をを用して,イメージイメージ范囲[-1,1]で再スケーリングします。

  • 観测値が128个未満のの部なミニバッチ破弃します。

  • イメージデータを次元ラベル“SSCB”(空间、空间、通道、批处理)で書式設定します。既定では,小公子オブジェクトは,基于なる型が单身的dlarray.オブジェクトにデータを変換します。

  • GPUが利用できる料,GPUで学习を行。小公子“OutputEnvironment”オプションが“汽车”のとき,GPUが利用可能ば,小公子は各出力をgpuArrayににします.gpuをを使するは,并行计算工具箱™,および计算能力3.0以上のcuda®対応nvidia®gpuが必要です。

Augimds.minibatchsize =小匹匹匹匹配;executionenvironment =“汽车”;MBQ = Minibatchqueue(Augimds,......“MiniBatchSize”miniBatchSize,......'partialminibatch'“丢弃”......'minibatchfcn'@preprocessMiniBatch,......'minibatchformat'“SSCB”......“OutputEnvironment”,刽子毒环境;

カスタム学习ループループをををモデルモデル习习させせせせせせループループループループししししでネットワークパラメーターをししますますますます进状况状况监视にににはははははははははははにははにははににににに配列配列配列配列ジェネレーターにに力し得られた生成イメージのと,スコアのプロットを表示し。

ADAMののパラメーターををしし。

trailingavggenerator = [];trailingavgsqgenerator = [];trailingavgdiscriminator = [];trailingavgsqdiscriminator = [];

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

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

numvalidationimages = 25;zvalidation = RANDN(1,1,NumlatentInputs,NumValidationImages,“单一”);

データをdlarray.オブジェクトに変换し,次元ラベル“SSCB”(空间、空间、通道、批处理)を指定します。

dlzvalidation = dlarray(zvalidation,“SSCB”);

GPUで学习するする合,データをgpuArrayオブジェクトに変换します。

如果(executionEnvironment = =“汽车”&& canusegpu)||executionenvironment ==.“GPU”dlzvalidation = gpuarray(dlzvalidation);结尾

学期习のの状况プロットプロットますプロットをが幅がががががになるて幅幅がしがしししに作なるようてしししし

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

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

imageAxes =情节(1、2、1);scoreAxes =情节(1、2、2);

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

LineScoreGenerator = AnimatedLine(Scoreaxes,“颜色”,[0 0.447 0.741]);LineScoredIscriminator = AnimatedLine(Scoreaxes,“颜色”,[0.85 0.325 0.098]);传奇('发电机'鉴频器的);ylim([01])xlabel(“迭代”)ylabel(“分数”网格)

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

各各ミニバッチで次をいい

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

  • 关节adamupdateを使用してネットワークパラメーターを更新。

  • 2つのネットワークのスコアプロット。

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

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

迭代= 0;开始=抽搐;%遍历纪元。为了epoch = 1:numepochs%重置和Shuffle数据存储。洗牌(兆贝可);%循环小批处理。尽管Hasdata (mbq)迭代=迭代+ 1;%读取小批数据。DLX =下一个(MBQ);%为发电机网络生成潜在输入。转换成%dlarray并指定维标标签'sscb'(空间,%空间,频道,批量)。如果在GPU上培训,则转换GPUARRAY的%潜在输入。z = Randn(1,1,NumlattentInputs,尺寸(DLX,4),“单一”);dlz = dlarray(z,“SSCB”);如果(executionEnvironment = =“汽车”&& canusegpu)||executionenvironment ==.“GPU”DLZ = GPUARRAY(DLZ);结尾%使用Model梯度和发电机状态进行评估%dlfeval和easturedients函数在结束时列出%的例子。[梯度总是,梯度分子剂,术语或级别,刻痕试验器,划分脉状物] =......dlfeval(@modelgradients,dlnetgenerator,dlnetdiscriminator,dlx,dlz,flipfactor);dlnetgenerator.state = stategenerator;%更新鉴别器网络参数。[dlnetDiscriminator, trailingAvgDiscriminator trailingAvgSqDiscriminator] =......Adamupdate(DLNETDISCRIMINATOR,梯度DISCRIMINATOR,......TrailIghaVGDIscriminator,Trailingavgsqdiscriminator,迭代,......learnRate、gradientDecayFactor squaredGradientDecayFactor);%更新生成网络参数。[DlnetGenerator,TrailingAvggenerator,TrailingAvgsqgenerator] =......Adamupdate(DlnetGenerator,渐变的Generator,......Trailighavggenerator,trailighavgsqgenerator,迭代,......learnRate、gradientDecayFactor squaredGradientDecayFactor);每一个验证频率迭代,使用该次数显示生成的图像批次%保留的发电机输入如果mod(迭代,验证频率)== 0 ||迭代== 1%使用保留的生成器输入生成图像。dlXGeneratedValidation =预测(dlnetGenerator dlZValidation);%瓷砖并重新归类范围的图像[0 1]。i = Imtile(提取数据(DLXGeneratedValidation));I =重新调节(我);%显示图像。子图(1,2,1);图像(Imageaxes,i)xticklabels([]);yticklabels([]);标题(“生成的图像”);结尾%更新分数绘图子图(1,2,2)addpoints(LineScoreGenerator,迭代,......双(收集(extractdata (scoreGenerator))));addpoints (lineScoreDiscriminator迭代,......双(收集(extractdata (scoreDiscriminator))));%使用培训进度信息更新标题。d =持续时间(0,0,toc(start),“格式”“hh: mm: ss”);标题(......“时代:”+ epoch +“,”+......“迭代:“+迭代+“,”+......”经过:“+字符串(d))绘制结尾结尾

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

学习プロットプロット,ジェネレーターおよびディスクリミネーターのネットワークのをスコアています。Ganの学习过程の监视と一般的なモードモード识别を参照してください。

新しいイメージの生成

新しいイメージを生成するには,ジェネレーターに対して関数预测をを用して,乱数値の1 x 1 x 100の配列のバッチを含むdlarray.オブジェクトを指定します。イメージを并べて表示するするは关键inmtile.を使用し,関数重新调节を使ってイメージを再スケーリングします。

乱数値の1 x 1 x 100の配列25个のバッチ含むdlarray.オブジェクトを作成します。

znew = randn(1,1,numlatentinputs,25,“单一”);dlznew = dlarray(znew,“SSCB”);

GPUを使用してイメージ生成するは,データをgpuArrayオブジェクトにも変換します。

如果(executionEnvironment = =“汽车”&& canusegpu)||executionenvironment ==.“GPU”dlznew = gpuarray(dlznew);结尾

关节预测をジェネレーターと入力データと共に使使し,新闻イメージを生成します。

dlxgeneratednew =预测(Dlnetgenerator,dlznew);

イメージを表示します。

我= imtile (extractdata (dlXGeneratedNew));I =重新调节(我);数字图像(I)轴离开标题(“生成的图像”

モデル勾配関数

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

功能[梯度总是,梯度分子剂,术语或级别,刻痕试验器,划分脉状物] =......modelGradients(dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor)%计算使用鉴别器网络的实际数据的预测。dlypry =前进(DlnetDiscriminator,DLX);%利用鉴别器网络计算生成数据的预测。[dlxgenerated,stategenerator] =向前(DlnetGenerator,DLZ);dlypredgenerated =前进(dlnetdiscriminator,dlxgenerated);将鉴别器输出转换为概率。probgenerated = sigmoid(dlypredgenerated);probreal = sigmoid(dlypred);%计算鉴别器的得分。划分((突起)+平均值(1-probgenerated))/ 2);%计算发电机的得分。scoreGenerator =意味着(probGenerated);%随机翻转真实图像的一部分标签。numobservations = size(probreal,4);idx = randperm(numobservations,backs(flipfactor * numobservations));%翻转标签probReal (:,:,:, idx) = 1-probReal (:,:,:, idx);%计算GAN损失。[损失Generator] = Ganloss(Probreal,Probgenerated);每个网络的%,相对于损耗计算梯度。梯度Generator = Dlgradient(LockGenerator,DlnetGenerator.Learnables,“RetainData”,真正的);梯度Discriminator = Dlgradient(LockDiscriminator,DLNetDiscriminator.Learnables);结尾

GaNの损失关键词スコア

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

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

  • y ˆ = σ y は,入力イメージが実“クラスに属する確率です。

  • 1 - y ˆ は,入力イメージが“生成”クラスに属している确率确率。

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

lossGenerator = - 的意思是 日志 y ˆ 生成

ここで, y ˆ G E. N. E. R. 一种 T. E. D. は生成イメージに対するのの力确率确率を表していい

ディスクリミネーターの目的ははジェネレータージェネレータージェネレーターにににですが実イメージと生生イメージイメージをしく区别する确率を大容量には,対応する负の対关键词和を最の尤度。

ディスクリミネーターディスクリミネーター损失关键词次のでで表さます。

损失Discriminator. = - 的意思是 日志 y ˆ 真实的 - 的意思是 日志 1 - y ˆ 生成

ここで, y ˆ R. E. 一种 L. は実イメージに対するディスクリミネーターの出力確率を表しています。

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

ジェネレーターのスコアは,生成イメージに対するディスクリミネーターののに対応する确率の平等です。

刻痕 = 的意思是 y ˆ 生成

ディスクリミネーターのスコアは,実イメージと生成イメージの両ディスクリミネーターディスクリミネーターののに确率确率のです。

划分的鳄鱼 = 1 2 的意思是 y ˆ 真实的 + 1 2 的意思是 1 - y ˆ 生成

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

功能[损失Generator,损失Discriminator] = Ganloss(Probreal,Probenerated)%计算鉴别器网络的损失。loctDiscriminator = -mean(log(probreal))-mean(log(1-probenerated));%计算发电机网络的损耗。损失generator = -mean(log(probgenerated));结尾

ミニバッチミニバッチ经理关联

关节Preprocessminibatch.は,次次の手顺でデータを前前处ししし

  1. 入力细胞配列からイメージデータを抽出ししてますますししますますします。

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

功能x = preprocessminibatch(数据)%contenate mini-batchX = CAT(4,数据{:});%缩放范围[-1 1]的图像。x = Rescale(x,-1,1,“InputMin”0,'inputmax', 255);结尾

参考文献

  1. TensoRflow团队。花卉http://download.tensorflow.org/example_images/flower_photos.tgz.

  2. 雷德福,亚历克,卢克·梅茨,还有苏密斯·金塔拉。"基于深度卷积生成对抗网络的无监督表示学习"ARXIV预印迹ARXIV:1511.06434(2015)。

参考

|||||||

关键词トピック