Why happens all the gradients of the generator are zero (from the beginning to the end) when training a GAN
Ältere Kommentare anzeigen
I want to train a generator which generates values of a sin function. However, when training a GAN, all the gradients of the generator are zero. I do not know what the problem is. Could anyone help me?
The code is listed as follows:
batch_size = 64;
n_ideas = 5;
art_components = 15;
step = 2/(art_components-1);
points = -1:step:1;
paint_points = repmat(points,batch_size,1);
Generator = [
featureInputLayer(n_ideas)
fullyConnectedLayer(128)
reluLayer
fullyConnectedLayer(art_components)
];
Discriminator = [
featureInputLayer(art_components)
fullyConnectedLayer(128)
reluLayer
fullyConnectedLayer(1)
sigmoidLayer
];
net_g = dlnetwork(Generator);
net_d = dlnetwork(Discriminator);
lr = 0.0001;
decay = 0.90;
sqdecay = 0.999;
avg_decay_g = [];
avd_sqdecay_g = [];
avg_decay_d = [];
avd_sqdecay_d = [];
for e=1:10000
artis_paintings = dlarray(single(artist_work(art_components,paint_points)),'BC');
% update learnable parameters of discriminator
g_ideas = dlarray(single(randn(batch_size,n_ideas)),'BC');
g_paintings = forward(net_g,g_ideas);
[loss_d,gradient_d,score_d] = ...
dlfeval(@d_loss,net_d,artis_paintings,g_paintings);
[net_d, avg_decay_d, avd_sqdecay_d] = ...
adamupdate(net_d,gradient_d,avg_decay_d,avd_sqdecay_d,e,lr,decay,sqdecay);
% update learnable parameters of generator
g_ideas = dlarray(single(randn(batch_size,n_ideas)),'BC');
g_paintings = forward(net_g,g_ideas);
prob_artist1 = forward(net_d,g_paintings);
[loss_g,gradient_g,score_g] = ...
dlfeval(@g_loss,net_g,prob_artist1);
[net_g, avg_decay_g, avd_sqdecay_g] = ...
adamupdate(net_g,gradient_g,avg_decay_g,avd_sqdecay_g,e,lr,decay,sqdecay);
end
function [loss_d,gradient_d,score_d] = ...
d_loss(net_d,artis_paintings,g_paintings)
% calculate loss
prob_artist0 = forward(net_d,artis_paintings);
prob_artist1 = forward(net_d,g_paintings);
score_d = mean(1-prob_artist1);
loss_d = -mean(log(prob_artist0)) - mean(log(1-prob_artist1));
% calculate gradients
gradient_d = dlgradient(loss_d, net_d.Learnables);
end
function [loss_g,gradient_g,score_g] = ...
g_loss(net_g,prob_artist1)
score_g = mean(prob_artist1);
% calculate gradients
loss_g = -mean(log(prob_artist1));
gradient_g = dlgradient(loss_g, net_g.Learnables);
end
function paintings=artist_work(art_components,paint_points)
r = 0.02 * randn(1,art_components);
paintings = sin(paint_points *pi) + r;
end
Akzeptierte Antwort
Weitere Antworten (0)
Kategorien
Mehr zu Parallel and Cloud finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!