clear all
close all
clc
NoFile=1;
while isfolder(sprintf('GAN%03i',NoFile))
NoFile=NoFile+1;
end
FolderName=sprintf('GAN%03i',NoFile);
mkdir(FolderName);
FileVideo=[FolderName filesep 'video' sprintf('%03i',NoFile) '.avi'];
FileData=[FolderName filesep 'data' sprintf('%03i',NoFile) ];
v=VideoWriter(FileVideo);
open(v);
datasetFolder= ;
imds = imageDatastore(datasetFolder, ...
'IncludeSubfolders',true, ...
'LabelSource','foldernames');
augmenter = imageDataAugmenter( ...
'RandXReflection',true, ...
'RandScale',[1 2]);
nx=64;
ny=64;
augimds = augmentedImageDatastore([ny ny],imds);
filterSize = [4 4];
numFilters = 16;
numLatentInputs = 15;
windowChannelSize=10;
layersGenerator = [
imageInputLayer([1 1 numLatentInputs],'Normalization','none','Name','in')
transposedConv2dLayer(filterSize,8*numFilters,'Name','tconv1')
batchNormalizationLayer('Name','bn1','Epsilon',5e-5)
reluLayer('Name','relu1')
transposedConv2dLayer(filterSize,4*numFilters,'Stride',2,'Cropping',1,'Name','tconv2')
batchNormalizationLayer('Name','bn2','Epsilon',5e-5)
reluLayer('Name','relu2')
transposedConv2dLayer(filterSize,2*numFilters,'Stride',2,'Cropping',1,'Name','tconv3')
batchNormalizationLayer('Name','bn3','Epsilon',5e-5)
reluLayer('Name','relu3')
transposedConv2dLayer(filterSize,numFilters,'Stride',2,'Cropping',1,'Name','tconv4')
batchNormalizationLayer('Name','bn4','Epsilon',5e-5)
reluLayer('Name','relu4')
transposedConv2dLayer(filterSize,3,'Stride',2,'Cropping',1,'Name','tconv5')
tanhLayer('Name','tanh')];
lgraphGenerator = layerGraph(layersGenerator);
dlnetGenerator = dlnetwork(lgraphGenerator)
scale = 0.2;
layersDiscriminator = [
imageInputLayer([64 64 3],'Normalization','none','Name','in')
convolution2dLayer(filterSize,numFilters,'Stride',2,'Padding',1,'Name','conv1')
leakyReluLayer(scale,'Name','lrelu1')
dropoutLayer(0.25,'Name','drop1')
convolution2dLayer(filterSize,2*numFilters,'Stride',2,'Padding',1,'Name','conv2')
batchNormalizationLayer('Name','bn2','Epsilon',5e-5)
leakyReluLayer(scale,'Name','lrelu2')
dropoutLayer(0.25,'Name','drop2')
convolution2dLayer(filterSize,4*numFilters,'Stride',2,'Padding',1,'Name','conv3')
batchNormalizationLayer('Name','bn3','Epsilon',5e-5)
leakyReluLayer(scale,'Name','lrelu3')
dropoutLayer(0.25,'Name','drop3')
convolution2dLayer(filterSize,8*numFilters,'Stride',2,'Padding',1,'Name','conv4')
batchNormalizationLayer('Name','bn4','Epsilon',5e-5)
leakyReluLayer(scale,'Name','lrelu4')
dropoutLayer(0.25,'Name','drop4')
convolution2dLayer(filterSize,1,'Name','conv5')];
lgraphDiscriminator = layerGraph(layersDiscriminator);
dlnetDiscriminator = dlnetwork(lgraphDiscriminator)
numEpochs = 1500;
miniBatchSize = 512;
augimds.MiniBatchSize = miniBatchSize;
learnRateGenerator = 0.0002;
learnRateDiscriminator = 0.0001;
trailingAvgGenerator = [];
trailingAvgSqGenerator = [];
trailingAvgDiscriminator = [];
trailingAvgSqDiscriminator = [];
gradientDecayFactor = 0.5;
squaredGradientDecayFactor = 0.999;
executionEnvironment = "auto";
NbImgValidation=16;
ZValidation = randn(1,1,numLatentInputs,NbImgValidation,'single');
dlZValidation = dlarray(ZValidation,'SSCB');
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
dlZValidation = gpuArray(dlZValidation);
end
figure
iteration = 0;
start = tic;
ArraylossGenerator=NaN(1,1000);
ArraylossDiscriminator=NaN(1,1000);
for noEpoch = 1:numEpochs
if mod(noEpoch,10)==0 && noEpoch>1
save([FileData '_' sprintf('%03i',noEpoch)],'numLatentInputs','dlnetGenerator','dlnetDiscriminator');
end
reset(augimds);
augimds = shuffle(augimds);
while hasdata(augimds)
fprintf('Epoch : %i Iter : %i mod : %i\n',noEpoch,iteration,mod(iteration,10));
data = read(augimds);
if size(data,1) < miniBatchSize
continue
end
iteration = iteration + 1;
X = cat(4,data{:,1}{:});
Z = randn(1,1,numLatentInputs,size(X,4),'single');
X = (single(X)/255)*2 - 1;
dlX = dlarray(X, 'SSCB');
dlZ = dlarray(Z, 'SSCB');
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
dlX = gpuArray(dlX);
dlZ = gpuArray(dlZ);
end
[gradientsGenerator, gradientsDiscriminator, stateGenerator,lossGenerator, lossDiscriminator] = ...
dlfeval(@modelGradients, dlnetGenerator, dlnetDiscriminator, dlX, dlZ);
dlnetGenerator.State = stateGenerator;
if length(ArraylossGenerator)<iteration
ArraylossGenerator=[ArraylossGenerator NaN(1,1000)];
ArraylossDiscriminator=[ArraylossDiscriminator NaN(1,1000)];
end
ArraylossGenerator(iteration)=gather(extractdata(lossGenerator));
ArraylossDiscriminator(iteration)=gather(extractdata(lossDiscriminator));
[dlnetDiscriminator.Learnables,trailingAvgDiscriminator,trailingAvgSqDiscriminator] = ...
adamupdate(dlnetDiscriminator.Learnables, gradientsDiscriminator, ...
trailingAvgDiscriminator, trailingAvgSqDiscriminator, iteration, ...
learnRateDiscriminator, gradientDecayFactor, squaredGradientDecayFactor);
[dlnetGenerator.Learnables,trailingAvgGenerator,trailingAvgSqGenerator] = ...
adamupdate(dlnetGenerator.Learnables, gradientsGenerator, ...
trailingAvgGenerator, trailingAvgSqGenerator, iteration, ...
learnRateGenerator, gradientDecayFactor, squaredGradientDecayFactor);
if mod(iteration,10) == 0 || iteration == 1
dlXGeneratedValidation = predict(dlnetGenerator,dlZValidation);
subplot(1,2,2);
I = imtile(extractdata(dlXGeneratedValidation));
I = rescale(I);
image(I)
D = duration(0,0,toc(start),'Format','hh:mm:ss');
title(...
"Epoch: " + noEpoch + ", " + ...
"Iteration: " + iteration + ", " + ...
"Elapsed: " + string(D))
if iteration==1
subplot(2,2,1);
hPlot1=plot(ArraylossGenerator);
xlabel('iteration');
title('loss generator');
subplot(2,2,3);
hPlot2=plot(ArraylossDiscriminator);
xlabel('iteration');
title('loss discriminator');
set(gcf,'position',[ 89.4000 245.4000 958.6000 516.6000]);
else
hPlot1.YData=ArraylossGenerator;
hPlot2.YData=ArraylossDiscriminator;
end
frame = getframe(gcf);
writeVideo(v,frame);
drawnow
end
end
end
close(v);
save(FileData);
ZNew = randn(1,1,numLatentInputs,16,'single');
dlZNew = dlarray(ZNew,'SSCB');
if (executionEnvironment == "auto" && canUseGPU) || executionEnvironment == "gpu"
dlZNew = gpuArray(dlZNew);
end
dlXGeneratedNew = predict(dlnetGenerator,dlZNew);
figure
I = imtile(extractdata(dlXGeneratedNew));
I = rescale(I);
image(I)
title("Generated Images")
function [gradientsGenerator, gradientsDiscriminator, stateGenerator,lossGenerator, lossDiscriminator] = ...
modelGradients(dlnetGenerator, dlnetDiscriminator, dlX, dlZ)
dlYPred = forward(dlnetDiscriminator, dlX);
[dlXGenerated,stateGenerator] = forward(dlnetGenerator,dlZ);
dlYPredGenerated = forward(dlnetDiscriminator, dlXGenerated);
[lossGenerator, lossDiscriminator] = ganLoss(dlYPred,dlYPredGenerated);
gradientsGenerator = dlgradient(lossGenerator, dlnetGenerator.Learnables,'RetainData',true);
gradientsDiscriminator = dlgradient(lossDiscriminator, dlnetDiscriminator.Learnables);
end
function [lossGenerator, lossDiscriminator] = ganLoss(dlYPred,dlYPredGenerated)
lossGenerated = -mean(log(1-sigmoid(dlYPredGenerated)));
lossReal = -mean(log(0.9*sigmoid(dlYPred)));
lossDiscriminator = lossReal + lossGenerated;
lossGenerator = -mean(log(sigmoid(dlYPredGenerated)));
end
0 Comments
Sign in to comment.