主要内容

이번역페이지는최신내용을담고있지않습니다。최신내용을영문으로보려면여기를클릭하십시오。

생성적 적대 신경망(甘)훈련시키기

이예제에서는생성적적대신경망을훈련시켜서영상을생성하는방법을보여줍니다。

생성적 적대 신경망(甘)은 입력값인 실제 데이터와 비슷한 특징을 갖는 데이터를 생성할 수 있는 딥러닝 신경망의 한 종류입니다.

氮化镓은함께훈련되는다음과같은두개의신경망으로구성됩니다。

  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('正在下载花卉数据集(218MB)…')websave(文件名,url);untar(文件名,下载文件夹)终止

꽃사진을포함하는영상데이터저장소를만듭니다。

datasetFolder = fullfile (imageFolder);imd = imageDatastore (datasetFolder,...“IncludeSubfolders”,真正的);

무작위가로뒤집기를포함하도록데이터를증대하고,영상의크기가64×64가되도록크기를조정합니다。

增量= imageDataAugmenter (“随机选择”,真正的);augimds = augmentedImageDatastore([64 64],imds,“数据增强”、增压器);

생성기 신경망 정의하기

100年크기가인확률벡터에서영상을생성하는다음과같은신경망아키텍처를정의합니다。

이신경망은다음을수행합니다。

  • 사영 및 형태 변경계층을 사용하여, 크기가 100인 확률 벡터를 7×7×128 배열로 변환합니다.

  • 일련의전치된컨벌루션계층,배치정규화계층,ReLU계층을사용하여,결과로생성된배열을64×64×3배열로업스케일링합니다。

이신경망아키텍처를계층그래프로정의하고다음과같은신경망속성을지정합니다。

  • 전치된컨벌루션계층에대해,각계층에대한내림차순개수의필터로구성된5×5필터를지정하고,스트라이드로를2지정하고,각가장자리에서출력값의자르기를지정합니다。

  • 전치된 마지막 컨벌루션 계층에 대해, 생성된 영상의 RGB채널 3.개에 대응되는 3.개의 5×5 필터를 지정하고, 출력값 크기를 직전 계층의 크기로 지정합니다.

  • 신경망 끝부분에 谭계층을 삽입합니다.

잡음 입력값을 사영 및 형태 변경하려면 사용자 지정 계층projectAndReshapeLayer를사용하십시오。이계층은이예제의마지막부분에지원파일로첨부되어있습니다。projectAndReshapeLayer객체는완전연결연산을사용하여입력값을업스케일링하고출력값을지정된크기로형태변경합니다。

filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layersGenerator = [featureInputLayer(numLatentInputs,“姓名”,“在”)ProjectandShapeLayer(projectionSize,numLatentInputs,“姓名”,“项目”);transposedConv2dLayer (filterSize 4 * numFilters,“姓名”,“tconv1”) batchNormalizationLayer (“姓名”,“bnorm1”)雷卢耶(“姓名”,“relu1”) transposedConv2dLayer (2 * numFilters filterSize,“大步走”2,“种植”,“相同”,“姓名”,‘tconv2’) batchNormalizationLayer (“姓名”,“bnorm2”)雷卢耶(“姓名”,“relu2”) transposedConv2dLayer (filterSize numFilters,“大步走”2,“种植”,“相同”,“姓名”,“tconv3”) batchNormalizationLayer (“姓名”,“bnorm3”)雷卢耶(“姓名”,“relu3”) transposedConv2dLayer (filterSize 3“大步走”2,“种植”,“相同”,“姓名”,“tconv4”)坦莱尔(“姓名”,的双曲正切));lgraphGenerator = layerGraph (layersGenerator);

사용자지정훈련루프를사용하여신경망을훈련시키고자동미분을활성화하려면계층그래프를dlnetwork객체로변환하십시오。

dlnetGenerator=dlnetwork(lgraphGenerator);

판별기신경망정의하기

실제 및 생성된 64×64 영상을 분류하는 다음과 같은 신경망을 정의합니다.

64×64×3영상을받아서일련의컨벌루션계층,배치정규화계층,漏ReLU계층을사용하여스칼라예측점수를반환하는신경망을만듭니다。드롭아웃을사용하여입력영상에잡음을추가합니다。

  • 드롭아웃계층에대해,드롭아웃확률을0.5로지정합니다。

  • 컨벌루션 계층에 대해, 각 계층에 대한 오름차순 개수의 필터로 구성된 5×5 필터를 지정합니다. 스트라이드를 2.로 지정하고 출력값의 채우기를 지정합니다.

  • 漏水的ReLU계층에대해,스케일을0.2로지정합니다。

  • 마지막계층에대해,하나의4×4필터를갖는컨벌루션계층을지정합니다。

[0, 1]범위의확률로출력하기위해예제의모델기울기함수섹션에있는模型梯度함수의乙状结肠함수를 사용합니다.

dropoutProb = 0.5;numFilters = 64;规模= 0.2;inputSize = [64 64 3];filterSize = 5;layersDiscriminator = [imageInputLayer(inputSize,“归一化”,“没有”,“姓名”,“在”) dropoutLayer (dropoutProb“姓名”,“辍学”)卷积2dlayer(filterSize、NumFilter、,“大步走”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”1) convolution2dLayer(4日,“姓名”,“conv5”));lgraphDiscriminator = layerGraph (layersDiscriminator);

사용자지정훈련루프를사용하여신경망을훈련시키고자동미분을활성화하려면계층그래프를dlnetwork객체로변환하십시오。

dlnetDiscriminator=dlnetwork(lgraphDiscriminator);

모델 기울기와 손실 함수 정의하기

이예제의모델기울기함수섹션에 나와 있는 함수模型梯度를만듭니다。이함수는생성기신경망과판별기신경망,입력데이터로구성된미니배치,난수값으로구성된배열과뒤집기인자를입력값으로받습니다。그런다음신경망의학습가능한파라미터에대한손실의기울기와두신경망의점수를반환합니다。

훈련옵션지정하기

纪元500회에 대해 크기가 128인 미니 배치를 사용하여 훈련시킵니다. 크기가 큰 데이터 세트의 경우에는 이렇게 많은 纪元횟수만큼 훈련하지 않아도 될 수 있습니다.

numEpochs=500;miniBatchSize=128;

亚当최적화에 대한 옵션을 지정합니다. 두 신경망에 대해 다음을 지정합니다.

  • 학습률0.0002

  • 기울기감쇠인자0.5

  • 제곱기울기감쇠인자0.999

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

판별기가실제영상과생성된영상을구분하는방법을지나치게빨리학습하는경우생성기훈련이실패할수있습니다。판별기와생성기의학습균형을맞추려면레이블을무작위로뒤집어서실제데이터에잡음을추가하십시오。

flipFactor0.3값을으로지정하여실제레이블의30%(총레이블의15%)를뒤집습니다。그러나생성된모든영상에는여전히올바른레이블이적용되어있으므로이로인해생성기의성능이저하되지는않습니다。

翻转系数=0.3;

100회의반복마다,생성된검증영상을표시합니다。

验证频率=100;

모델 훈련시키기

minibatchqueue를 사용하여 영상 미니 배치를 처리하고 관리합니다. 각 미니 배치에 대해 다음을 수행합니다.

  • (이예제의마지막부분에서정의되는)사용자지정미니배치전처리함수预处理小批量를사용하여영상을[1]범위로다시스케일링합니다。

  • 관측값이 128개 미만인 부분 미니 배치를 모두 무시합니다.

  • 각각 공간(空间),공간(空间),채널(频道),배치(批)를 뜻하는 차원 레이블“SSCB”를사용하여영상데이터의형식을지정합니다。기본적으로minibatchqueue객체는기본유형을 사용하여 데이터를dlarray객체로변환합니다。

  • 사용가능GPU한가있으면GPU에서훈련시킵니다。minibatchqueue“OutputEnvironment”옵션이“汽车”이면minibatchqueue는 GPU를 사용할 수 있는 경우 각 출력값을gpuArray로 변환합니다. GPU를 사용하려면 并行计算工具箱™와 计算能力3.0이상의 CUDA®지원 NVIDIA®GPU가 필요합니다.

augimds.MiniBatchSize=MiniBatchSize;executionEnvironment=“汽车”;兆贝可= minibatchqueue (augimds,...“MiniBatchSize”miniBatchSize,...“PartialMiniBatch”,“丢弃”,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,“SSCB”,...“OutputEnvironment”执行环境);

사용자 지정 훈련 루프를 사용하여 모델을 훈련시킵니다. 루프를 사용해 훈련 데이터를 순회하고 각 반복에서 신경망 파라미터를 업데이트합니다. 훈련 진행 상황을 모니터링하려면, 생성기에 입력할, 난수 값으로 구성된 홀드아웃 배열을 사용하여 생성된 영상 배치를 표시하고, 점수 플롯도 표시하십시오.

亚当에대한파라미터를초기화합니다。

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

훈련 진행 상황을 모니터링하려면, 생성기에 입력된, 고정 확률 벡터의 홀드아웃 배치를 사용하여 생성된 영상 배치를 표시하고, 신경망 점수도 플로팅하십시오.

홀드아웃 난수 값으로 구성된 배열을 만듭니다.

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

데이터를dlarray객체로 변환하고 각각 채널(频道),배치(批)를 뜻하는 차원 레이블“CB”를 지정합니다.

dlZValidation=dlarray(ZValidation,“CB”);

GPU훈련을위해데이터를gpuArray객체로변환합니다。

如果(executionEnvironment = =“汽车”&&canUseGPU)| |执行环境==“图形”dlZValidation=gpuArray(dlZValidation);终止

훈련 진행 상황 플롯을 초기화합니다. 图形를 만들고 너비가 두 배가 되도록 크기를 조정합니다.

f=图形;f位置(3)=2*f位置(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([01])xlabel(“迭代”) ylabel (“分数”网格)

氮化镓을훈련시킵니다。각时代에대해,데이터저장소를섞고루프를사용해데이터의미니배치를순회합니다。

각 미니 배치에 대해 다음을 수행합니다.

  • dlfeval模型梯度함수를사용하여모델기울기를평가합니다。

  • 阿达木酯함수를사용하여신경망파라미터를업데이트합니다。

  • 두신경망의점수를플로팅합니다。

  • 验证频率회의 반복마다, 고정된 홀드아웃 생성기 입력값에 대해 생성된 영상 배치를 표시합니다.

훈련을 실행하는 데 다소 시간이 걸릴 수 있습니다.

迭代= 0;开始=抽搐;%循环纪元。对于时代= 1:numEpochs重置和洗牌数据存储。洗牌(兆贝可);%循环小批。Hasdata (mbq) iteration = iteration + 1;%读取小批数据。dlX=下一个(mbq);%为发电机网络生成潜在输入。皈依%dlarray并指定维度标签“CB”(通道,批次)。%如果在GPU上训练,则将潜在输入转换为gpuArray。Z = randn (numLatentInputs miniBatchSize,“单一”);dlZ = dlarray (Z,“CB”);如果(executionEnvironment = =“汽车”&&canUseGPU)| |执行环境==“图形”dlZ = gpuArray (dlZ);终止%使用评估模型梯度和生成器状态的% dlfeval和模型梯度函数%的例子。[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...dlfeval(@modelGradients, dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor);dlnetGenerator。状态= stateGenerator;%更新标识器网络参数。[dlnetDiscriminator, trailingAvgDiscriminator trailingAvgSqDiscriminator] =...adamupdate(dlnetDiscriminator、Gradients Discriminator、,...trailingAvgDiscriminator,trailingAvgSqDiscriminator,迭代,...learnRate、gradientDecayFactor squaredGradientDecayFactor);%更新发电机网络参数。[dlnetGenerator, trailingAvgGenerator trailingAvgSqGenerator] =...adamupdate (dlnetGenerator gradientsGenerator,...trailingAvgGenerator,trailingAvgSqGenerator,迭代,...learnRate、gradientDecayFactor squaredGradientDecayFactor);%每次validationFrequency迭代,使用%保留发电机输入。如果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,迭代,...双(收集(extractdata (scoreGenerator))));addpoints (lineScoreDiscriminator迭代,...双(收集(extractdata (scoreDiscriminator))));%用培训进度信息更新标题。D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”); 头衔(...”时代:“+纪元+", "+...“迭代:“+迭代+", "+...”经过:“+ drawnow字符串(D))终止终止

여기서, 판별기는 생성된 영상 중에서 실제 영상을 식별하는 강한 특징 표현을 학습했습니다. 생성기는 훈련 데이터와 유사한 영상을 생성할 수 있는, 마찬가지로 강한 특징 표현을 학습했습니다.

훈련플롯에생성기신경망과판별기신경망의점수가나와있습니다。신경망점수를해석하는방법에대한자세한내용은监控GAN培训进度,识别常见故障模式항목을참조하십시오。

새영상생성하기

새영상을생성하려면,预测함수를 확률 벡터 배치를 포함하는dlarray객체와함께생성기에사용하십시오。영상을함께표시하려면imtile함수를사용하고,重新缩放함수를사용하여영상을다시스케일링하십시오。

생성기신경망에입력할,25개의확률벡터배치를포함하는dlarray객체를 만듭니다.

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

GPU를사용하여영상을생성하려면데이터를gpuArray객체로도변환하십시오。

如果(executionEnvironment = =“汽车”&&canUseGPU)| |执行环境==“图形”dlZNew = gpuArray (dlZNew);终止

생성기및입력데이터와함께预测함수를사용하여새영상을생성합니다。

dlXGeneratedNew=预测(dlnetGenerator,dlZNew);

영상을 표시합니다.

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

모델기울기함수

함수模型梯度는생성기및판별기dlnetwork객체dlnetGeneratordlnetDiscriminator, 입력 데이터로 구성된 미니 배치dlX, 난수 값으로 구성된 배열dlZ, 뒤집을 실제 레이블의 백분율flipFactor를입력값으로받습니다。그런다음신경망의학습가능한파라미터에대한손실의기울기,생성기상태,두신경망의점수를반환합니다。판별기출력값이[0,1]범위에있지않으므로模型梯度함수는乙状结肠함수를적용하여출력값을확률로변환합니다。

函数[gradientsGenerator, gradientsDiscriminator, stateGenerator, scoreGenerator, scoreDiscriminator] =...模型梯度(dlnetGenerator, dlnetDiscriminator, dlX, dlZ, flipFactor)%使用鉴别器网络计算实际数据的预测。dlYPred=转发(dlnetDiscriminator,dlX);%用鉴别器网络计算生成数据的预测。[dlXGenerated,stateGenerator]=转发(dlnetGenerator,dlZ);dlYPredGenerated=转发(dlnetDiscriminator,dlXGenerated);%将鉴别器输出转换为概率。probGenerated=sigmoid(dlYPredGenerated);probReal=sigmoid(dlYPred);%计算鉴别器的得分。scoreDiscriminator = (mean(probReal) + mean(1-probGenerated)) / 2;%计算生成器的得分。scoreGenerator =意味着(probGenerated);%随机翻转真实图像的一小部分标签。numObservations =大小(probReal 4);idx = randperm(numObservations,floor(flipFactor * numObservations));%翻转标签。proreal (:,:,:,idx) = 1 - proreal (:,:,:,idx);%计算GAN损耗。[lossGenerator,lossDiscriminator]=ganLoss(probReal,probGenerated);%对于每个网络,计算相对于损失的梯度。gradientsGenerator = dlgradient(lossGenerator, dlnetGenerator。可学的,“RetainData”,true);gradientsDiscriminator=dlgradient(lossDiscriminator,dlnetDiscriminator.Learnables);终止

赣손실 함수와 점수

생성기의목적은판별기가“真正的”로분류하는데이터를생성하는것입니다。생성기에서나온영상이판별기에의해실제영상으로분류될확률을극대화하려면음의로그가능도함수를최소화하십시오。

판별기의출력값 Y 가 주어진 경우:

  • Y ˆ = σ ( Y ) 는입력영상이클래스“真正的”에속할확률입니다。

  • 1. - Y ˆ 은입력영상이클래스“生成”에속할확률입니다。

시그모이드 연산 σ 模型梯度함수에서수행됩니다。생성기에대한손실함수는다음과같이지정됩니다。

lossGenerator = - 意思是 ( 日志 ( Y ˆ 生成的 ) ) ,

여기서 Y ˆ G E N E R A. T E D 는생성된영상에대한판별기출력확률을포함합니다。

판별기의 목적은 생성기에 "속지" 않는 것입니다. 판별기가 실제 영상과 생성된 영상을 성공적으로 판별해 낼 확률을 극대화하려면 해당하는 음의 로그 가능도 함수 합을 최소화하십시오.

판별기에 대한 손실 함수는 다음과 같이 지정됩니다.

损失辨别器 = - 意思是 ( 日志 ( Y ˆ 真正的 ) ) - 意思是 ( 日志 ( 1. - Y ˆ 生成的 ) ) ,

여기서 Y ˆ R E A. L 은 실제 영상에 대한 판별기 출력 확률을 포함합니다.

생성기와 판별기가 각각의 목표를 얼마나 잘 달성하는지를 0부터 1.까지의 척도로 측정하기 위해 점수 개념을 사용할 수 있습니다.

생성기 점수는 생성된 영상에 대한 판별기 출력값에 대응되는 확률의 평균입니다.

记分发生器 = 意思是 ( Y ˆ 生成的 ) .

판별기점수는실제영상과생성된영상에대한판별기출력값에대응되는확률의평균입니다。

scoreDiscriminator = 1. 2. 意思是 ( Y ˆ 真正的 ) + 1. 2. 意思是 ( 1. - Y ˆ 生成的 ) .

점수는 손실에 반비례하지만 실질적으로 동일한 정보를 포함합니다.

函数[lossGenerator, lossDiscriminator] = ganLoss(probReal,probGenerated)%计算鉴别器网络的损耗。lossDiscriminator = -mean(log(probReal)) -mean(log(1-probGenerated));%计算发电机网络的损耗。lossGenerator=-平均值(log(probGenerated));终止

미니배치전처리함수

预处理小批量함수는 다음 단계를 사용하여 데이터를 전처리합니다.

  1. 입력되는 셀형 배열에서 영상 데이터를 추출하여 숫자형 배열로 결합합니다.

  2. 영상이[1]범위내에있도록다시스케일링합니다。

函数X = preprocessMiniBatch(数据)%串联小批量X =猫(4、数据{:});%在[-1 1]范围内重新缩放图像。X=重新缩放(X,-1,1,“InputMin”0,“InputMax”,255);终止

참고문헌

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

  2. Radford、Alec、Luke Metz和Soumith Chintala.《深层卷积生成对抗网络的无监督表征学习》,预印本,2015年11月19日提交。http://arxiv.org/abs/1511.06434.

참고항목

|||||||

관련항목