。
この例では,敵対的生成ネットワーク(GAN)に学習させてイメージを生成する方法を説明します。
敌対的生成ネットワーク(GaN)は深层学习ネットワークの种,入力され実に类似した性をもつを生成できでき。
Ganは一般绪学习を行为2つのネットワークで构成されてます。
ジェネレーター - このネットワークは,乱数値(现处入力)のベクトルをを力としてられ,学校习と同じ构造データ生成します。
ディスクリミネーター - このネットワークは,学习データとジェネレーターにより生成されたデータの両方からの観测値を含むデータのバッチを与えられ,その観测値が “実データ” か “生成データ” かの分类を试みます。
Ganに学刊ささせるせるは,両方のネットワークの学习习同时に行う両者両者ののを最最します。
ジェネレーターに学习させて,ディスクリミネーターディスクリミネーター“骗す”データ生成。
ディスクリミネーターに学習させて,実データと生成データを区別。
ジェネレータージェネレーターの性能を最适最适するに,生成データデータが与えられときのディスクリミネーターの损失をを最しししししがががががディスクリミネーターがががデータデータとと类类するようようを生するするです。
ディスクリミネーターの性能を最適化するには,実データと生成データの両方のバッチが与えられたときのディスクリミネーターの損失を最小化します。つまり,ディスクリミネーターの目的はジェネレーターに”騙されない”ことです。
これらの方法によって,十分に現実的なデータを生成するジェネレーターと,学習データの特性である強い特徴表現を学習したディスクリミネーターを得ることが理想的な結果です。
花のデータセット[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 ('下载鲜花数据集(218 MB)......') websave(文件名,url);解压(文件名,downloadFolder)结束
花の写真のイメージデータストアを作成します。
datasetFolder = fullfile (imageFolder);imd = imageDatastore (datasetFolder,...“IncludeSubfolders”,真正的);
データを拡张して水平方向ににに反転せせ,イメージのサイズを64 x 64に変更します。
增量= imageDataAugmenter ('randxreflection',真正的);Augimds = 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のフィルター,前の层の出出をを。
ネットワークの最後に,双曲正切層を追加。
ノイズ入力を投影して形状変更するには,この例にサポートファイルとして添付されている,カスタム層ProjectAndreshapelayer.
を使用します。ProjectAndreshapelayer.
層は,全結合演算を使用して入力をスケールアップし,出力を指定サイズに形状変更します。
filterSize = 5;numFilters = 64;numlattentinputs = 100;ProjectionSize = [4 4 512];tallersgenerator = [imageInputlayer([1 1 numlatentInputs],'正常化',“没有”,“名字”,“在”) projectAndReshapeLayer (projectionSize numLatentInputs,“项目”);transposedConv2dLayer (filterSize 4 * numFilters,“名字”,“tconv1”batchnormalizationlayer(“名字”,'bnorm1') reluLayer (“名字”,'relu1')TransposedConv2dlayer(过滤,2 * NumFilters,“步”2,'裁剪',“相同”,“名字”,“tconv2”batchnormalizationlayer(“名字”,'bnorm2') reluLayer (“名字”,“relu2”)TransposedConv2dlayer(过滤,NumFilters,“步”2,'裁剪',“相同”,“名字”,“tconv3”batchnormalizationlayer(“名字”,'bnorm3') reluLayer (“名字”,“relu3”) transposedConv2dLayer (filterSize 3“步”2,'裁剪',“相同”,“名字”,'tconv4')Tanhlayer(“名字”,的双曲正切)];Lgroggenerator = LayerGraph(层Generator);
カスタム学習ループを使用してネットワークに学習させ,自動微分を有効にするには,層グラフをdlnetwork.
オブジェクトに変換します。
dlnetgenerator = dlnetwork(lgropgenerator);
64 x 64の実イメージと生成イメージを分類する,次のネットワークを定義します。
64 x 64 x 3ののを受け取り,バッチ正规化漏释放relu层のあるあるの畳み込み层を使使しスカラーの予测を返すをののスコアをををますますをますしますます。を追加します。
ドロップアウト层で,ドロップアウトの确率を0.5に设定。
畳み込み层で,5 x 5のフィルター指定し,各层でフィルター数号。また,ストライド2でで力をパディングように指定。
泄漏释放层,スケールを0.2に设定。
最後の層で,4 x 4のフィルターを1つもつ畳み込み層を設定。
範囲[0,1]の確率を出力するには,モデル勾配关节の関数sigmoid.
を使用します。
dropoutProb = 0.5;numFilters = 64;规模= 0.2;inputSize = [64 64 3];filterSize = 5;layersDiscriminator = [imageInputLayer(inputSize,'正常化',“没有”,“名字”,“在”)DropoutLayer(0.5,“名字”,'辍学')卷积2dlayer(过滤,numfilters,“步”2,'填充',“相同”,“名字”,“conv1”) leakyReluLayer(规模、“名字”,'lrelu1')卷积2dlayer(过滤,2 * numfilters,“步”2,'填充',“相同”,“名字”,“conv2”batchnormalizationlayer(“名字”,“bn2”) leakyReluLayer(规模、“名字”,'lrelu2') convolution2dLayer (filterSize 4 * numFilters,“步”2,'填充',“相同”,“名字”,“conv3”batchnormalizationlayer(“名字”,“bn3”) leakyReluLayer(规模、“名字”,'lrelu3') convolution2dLayer (filterSize 8 * numFilters,“步”2,'填充',“相同”,“名字”,“conv4”batchnormalizationlayer(“名字”,“bn4”) leakyReluLayer(规模、“名字”,'lrelu4'1) convolution2dLayer(4日,“名字”,“conv5”)];Lgraphdiscriminator = DaterGraph(LayersDiscriminator);
カスタム学習ループを使用してネットワークに学習させ,自動微分を有効にするには,層グラフをdlnetwork.
オブジェクトに変換します。
dlnetDiscriminator = dlnetwork (lgraphDiscriminator);
例のモデル勾配关节の节にリストさされいる关联MapicalGRADENTERS.
を作成します。この関数は,ジェネレーターネットワークおよびディスクリミネーターネットワーク,入力データのミニバッチ,および乱数値と反転係数の配列を入力として受け取り,ネットワーク内の学習可能なパラメーターについての損失の勾配と,2つのネットワークのスコアを返します。
ミニバッチサイズを128として500エポック学习さます。大きなデータセットは,学校ささで数码これより少なくできるできるがあります少なくできるできるががありありあり
numEpochs = 500;miniBatchSize = 128;
Adam最最适适のを指定しし両ようのネットワークで次のに设定しし両に设定しし両に设定しし
学習率0.0002
勾配の減衰係数0.5
2乗勾配の減衰係数0.999
学习= 0.0002;梯度Dayfactor = 0.5;squaredgradientdecayfactor = 0.999;
実イメージと生成イメージを区别するディスクリミネーター习习速度がすぎるすぎる场するジェネレーター习习に失败する性性のありありありバランスするため习习バランスをためためにににににににににににためためににささせて実実データに加入ます。
実ラベルの30%を反転するように指定します。これは,ラベルの総数の15%が学習中に反転することを意味します。生成されたイメージにはすべて正しいラベルが付いているので,これがジェネレーターに損失を与えることはない点に注意してください。
flipFactor = 0.3;
生成された検証イメージを100回の反復ごとに表示します。
validationFrequency = 100;
minibatchqueue
を使用して,イメージのミニバッチを処理および管理します。各ミニバッチで次を行います。
カスタムカスタム前经理关联preprocessMiniBatch
(この例の最後に定義)を使用して,イメージを範囲[1]
で再スケーリングします。
128年観測値が個未満の部分的なミニバッチは破棄します。
イメージデータを次元ラベル'SSCB'
(空间,空间,频道,批量)で书签设定します。既定既定で,minibatchqueue
オブジェクトは,基となる型が单
のdlarray
オブジェクトにデータを変换ますます。
GPUが利用できる場合,GPUで学習を行います。minibatchqueue
の'outputenvironment'
オプションが“汽车”
のとき,GPUが利用可能であれば,minibatchqueue
は各出力をGPUArray.
に変換します。GPU を使用するには、Parallel Computing Toolbox™、および Compute Capability 3.0 以上の CUDA® 対応 NVIDIA® GPU が必要です。
augimds。MiniBatchSize = MiniBatchSize;executionEnvironment =“汽车”;兆贝可= minibatchqueue (augimds,...'minibatchsize',小匹马,...“PartialMiniBatch”,'丢弃',...“MiniBatchFcn”,@preprocessminibatch,...“MiniBatchFormat”,'SSCB',...'outputenvironment', executionEnvironment);
カスタム学習ループを使用してモデルに学習させます。学習データ全体をループ処理し,各反復でネットワークパラメーターを更新します。学習の進行状況を監視するには,ホールドアウトされた乱数値の配列をジェネレーターに入力して得られた生成イメージのバッチと,スコアのプロットを表示します。
亚当のパラメーターを初期化します。
trailingAvgGenerator = [];trailingAvgSqGenerator = [];trailingAvgDiscriminator = [];trailingAvgSqDiscriminator = [];
学科の进行状况を监视するには,ホールドホールドアウトされたた値値固定配列のバッチバッチをジェネレーターて得られたたた生生生た表示表示表示表示表示し表示表示表示表示表示表示表示表示し
ホールドアウトされたたのの配列を作物成し。
numValidationImages = 25;ZValidation = randn (1, 1, numLatentInputs numValidationImages,'单身的');
データをdlarray
オブジェクトに変換し,次元ラベル'SSCB'
(空间,空间,频道,批量)ををします。
dlZValidation = dlarray (ZValidation,'SSCB');
GPUで学習する場合,データをGPUArray.
オブジェクトに変換します。
如果(execultenvironment ==.“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZValidation = gpuArray (dlZValidation);结束
学習の進行状況プロットを初期化します。图を作成して幅が2倍になるようサイズ変更します。
f =图;f.Position (3) = 2 * f.Position (3);
生成イメージとネットワークスコアサブサブプロットを作物成し。
imageaxes =子图(1,2,1);scoreaxes =子图(1,2,2);
スコアスコアのプロットにアニメーションアニメーションをををををしし。
lineScoreGenerator = animatedline (scoreAxes,'颜色'0.447 - 0.741 [0]);lineScoreDiscriminator = animatedline (scoreAxes,'颜色', [0.85 0.325 0.098];传奇(“发电机”,'鉴别者');ylim([0 1])包含(“迭代”) ylabel (“分数”) 网格在
氮化镓に学習させます。各エポックで,データストアをシャッフルしてデータのミニバッチについてループします。
各ミニバッチで次を行います。
関数dlfeval
およびMapicalGRADENTERS.
をを用してモデルの勾配评価评価します。
関数adamupdate.
を使用してネットワークパラメーターをを新。
2つのネットワークのスコアをプロット。
validationFrequency
の反复がすべて终了た后で,ホールドアウトされた固定ジェネレーターの生成イメージバッチをををををををををを表示表示をを表示表示表示表示表示表示表示表示表示表示表示表示表示表示表示を
学习を行うのににがかかる合并がます。
迭代= 0;start = tic;%循环epochs。为时代= 1:numEpochs%重置和洗牌数据存储。洗牌(MBQ);%循环在迷你批次。而Hasdata(MBQ)迭代=迭代+ 1;%读取迷你批次数据。dlX =下一个(兆贝可);%产生发电机网络的潜在输入。转换为% dlarray并指定维度标签'SSCB' (spatial,%空间,通道,批处理)。如果训练在GPU上,然后转换%潜在输入到gpuArray。Z = randn (1, - 1, numLatentInputs大小(dlX, 4),'单身的');dlZ = dlarray (Z,'SSCB');如果(execultenvironment ==.“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZ = gpuArray (dlZ);结束%使用评估模型梯度和发电机状态的末尾列出的% dlfeval和modelGradients函数% 例子。[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...dlfeval(@modelGradients, dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor);dlnetGenerator。状态= stateGenerator;%更新鉴别器网络参数。[DlnetDiscriminator,trailingavgdiscriminator,trailingavgsqdiscriminator] =...adamupdate (dlnetDiscriminator gradientsDiscriminator,...trailingAvgDiscriminator trailingAvgSqDiscriminator,迭代,...学习,梯度dayfactor,squaredgradientdecayfactor);%更新发电机网络参数。[dlnetGenerator, trailingAvgGenerator trailingAvgSqGenerator] =...adamupdate (dlnetGenerator gradientsGenerator,...trailingAvgGenerator trailingAvgSqGenerator,迭代,...学习,梯度dayfactor,squaredgradientdecayfactor);%每次validationFrequency迭代时,使用%HOLD-OUT发电机输入如果mod(iteration,validationFrequency) == 0 || iteration == 1%使用保持的发电机输入生成图像。dlxgeneratedValidation =预测(DlnetGenerator,DLZValidation);%平铺和缩放范围[0 1]的图像。我= imtile (extractdata (dlXGeneratedValidation));I =重新调节(我);%显示图像。次要情节(1、2、1);图像(imageAxes,我)xticklabels ([]);yticklabels ([]);标题(“生成的图像”);结束%更新分数图次要情节(1、2、2)addpoints (lineScoreGenerator,迭代,...双(收集(摘录(刻度))))));addpoints(LineScoredIscriminator,迭代,...双(收集(提取物)));%使用培训进度信息更新标题。D =持续时间(0,0,toc(开始),'格式','hh:mm:ss');标题(...”时代:“+时代+”、“+...“迭代:”+迭代+”、“+...“经过:”+ drawnow字符串(D))结束结束
ここでは,ディスクリミネーターは生成イメージ中から実イメージを识别する强い徴に対しを习しましたそれ,ジェネレータージェネレーターは実データのようにデータを生実データできるようににに强いをを実できるようにににに强い强い强い表现表现をににしした。
学習プロットは,ジェネレーターおよびディスクリミネーターのネットワークのスコアを示しています。ネットワークのスコアを解釈する方法の詳細については,氮化镓の学習過程の監視と一般的な故障モードの識別を参照してください。
新しいイメージを生成するするに,ジェネレーターに対して关预测
を使用して,乱数値の1 x 1 x 100の配列のバッチを含むdlarray
オブジェクトを指定します。イメージを並べて表示するには関数imtile
を使用し,关节rescale.
を使ってイメージを再スケーリングします。
乱数値の1 x 1 x 100の配列25個のバッチを含むdlarray
オブジェクトを作物成し。
ZNew = randn (1, 1, numLatentInputs, 25岁,'单身的');dlZNew = dlarray (ZNew,'SSCB');
GPUを使用してイメージを生成するには,データをGPUArray.
オブジェクトにも変换します。
如果(execultenvironment ==.“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlZNew = gpuArray (dlZNew);结束
関数预测
をジェネレーターと入力データと共に使用して,新しいイメージを生成します。
dlXGeneratedNew =预测(dlnetGenerator dlZNew);
イメージを表示します。
i = Imtile(提取数据(DLXGeneratedNew));I =重新调节(我);图图像(i)轴从标题(“生成的图像”)
関数MapicalGRADENTERS.
は,ジェネレーターおよびディスクリミネーターのdlnetwork.
オブジェクトであるdlnetGenerator
とdlnetDiscriminator
,入力データのミニバッチdlX
、乱数値の配列dlZ
,および実ラベルの反転する结合flipFactor,
をを力量として,ネットワーク内の学习可以なについての损失の勾配,ジェネレータージェネレーター状态,および2つのネットワークの返します。ディスクリミネーターディスクリミネーターのます范囲[0,1]に含まれないため,MapicalGRADENTERS.
はシグモイド関数を適用してこれを確率に変換します。
函数[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...ModelGRADENTERS(DLNETGENERATOR,DLNETDISCRIMINATOR,DLX,DLZ,FLIPFORTOR)%利用鉴别器网络计算对真实数据的预测。dlYPred = forward(dlnetDiscriminator, dlX);%计算具有鉴别器网络的生成数据的预测。向前(dlXGenerated stateGenerator] = (dlnetGenerator, dlZ);dlYPredGenerated = forward(dlnetDiscriminator, dlXGenerated);%将鉴别器输出转换为概率。probGenerated =乙状结肠(dlYPredGenerated);probReal =乙状结肠(dlYPred);%计算鉴别器的得分。scoreDiscriminator =((意思(probReal) + (1-probGenerated)) / 2);%计算生成器的分数。刻录物=平均值(probgenerated);%随机翻转真实图像的标签的一部分。numObservations =大小(probReal 4);idx = randperm(numObservations,floor(flipFactor * numObservations));%翻转标签probreal(::::,idx)= 1-probreal(::::,IDX);%计算GaN丢失。[lossGenerator, lossDiscriminator] = ganLoss(probReal,probGenerated);%对于每个网络,计算相对于损失的梯度。= dlgradient(lossGenerator, dlnetGenerator. dll)可学的,'etaindata',真正的);gradientsDiscriminator = dlgradient(lossDiscriminator, dlnetDiscriminator.Learnables);结束
ジェネレーターの目的はディスクリミネーターが”実データ”に分類するようなデータを生成することです。ジェネレーターが生成したイメージをディスクリミネーターが実データとして分類する確率を最大化するには,負の対数尤度関数を最小化します。
ディスクリミネーターの出力 が与えられたた合,次のようになり。
は,入力イメージイメージがが実実にに属する确率
は,入力イメージが”生成“クラスに属している確率です。
シグモイド演算
は関数MapicalGRADENTERS.
ででわててててて。
ここで, は生成イメージに対するディスクリミネーターの出力確率を表しています。
ディスクリミネーターの目的はジェネレーターに”騙されない”ことです。ディスクリミネーターが実イメージと生成イメージを正しく区別する確率を最大化するには,対応する負の対数尤度関数の和を最小化します。
ディスクリミネーターの損失関数は次の式で表されます。
ここで, は実イメージに対するディスクリミネーターのの确率确率を表していい。
ジェネレーターとディスクリミネーターがそれぞれの目標をどれだけ達成するかを0から1のスケールで測定するには,スコアの概念を使用できます。
ジェネレーターのスコアは,生成イメージに対するディスクリミネーターの出力に対応する確率の平均です。
ディスクリミネーターのスコアは,実イメージと生成イメージの両方に対するディスクリミネーターの出力に対応する確率の平均です。
。
函数[lossGenerator, lossDiscriminator] = ganLoss(probReal,probGenerated)告警解释%计算鉴别器网络的损失。lossDiscriminator = -mean(log(probReal)) -mean(log(1-probGenerated));%计算发电网络的损耗。lossGenerator =意味着(日志(probGenerated));结束
関数preprocessMiniBatch
は,次の手順でデータを前処理します。
入力电池配列からイメージデータを抽出して数値配列に連結します。
イメージの範囲が[1]
ととなるようにに再スケーリングしし
函数X = preprocessMiniBatch(数据)%连接mini-batchX =猫(4、数据{:});%重新归类范围[-1 1]中的图像。X =重新调节(X, 1, 1,'Inputmin',0,“InputMax”,255);结束
TensorFlow团队。花http://download.tensorflow.org/example_images/flower_photos.tgz
Radford,Alec,Luke Metz,以及Soumith Chintala。“无知的代表学习,深卷积生成的对抗网络。”arXiv预印本arXiv: 1511.06434(2015)。
adamupdate.
|dlarray
|dlfeval
|dlgradient
|dlnetwork.
|向前
|minibatchqueue
|预测