From 81f6567dac60d78e5f5f4d9c0bcdfab21a48ed86 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Tue, 26 Mar 2019 16:57:57 +0530 Subject: [PATCH 1/4] Added DCGAN and cGAN files. 1. The original commits were messed up. This commit overwrites all previous commits. 2.The markdown files and the instructions to run the code is given. --- vision/mnist/DCGAN/GAN-1.jpg | Bin 0 -> 44880 bytes vision/mnist/DCGAN/dcgan.jl | 157 ++++++++++++++++++++++++++++++ vision/mnist/DCGAN/dcgan.md | 24 +++++ vision/mnist/DCGAN/frames.pdf | Bin 0 -> 20722 bytes vision/mnist/DCGAN/gan.png | Bin 0 -> 26884 bytes vision/mnist/cGAN/cGAN.jpg | Bin 0 -> 39721 bytes vision/mnist/cGAN/cgan.jl | 148 ++++++++++++++++++++++++++++ vision/mnist/cGAN/cgan.md | 16 +++ vision/mnist/cGAN/sample_cgan.png | Bin 0 -> 796 bytes 9 files changed, 345 insertions(+) create mode 100644 vision/mnist/DCGAN/GAN-1.jpg create mode 100644 vision/mnist/DCGAN/dcgan.jl create mode 100644 vision/mnist/DCGAN/dcgan.md create mode 100644 vision/mnist/DCGAN/frames.pdf create mode 100644 vision/mnist/DCGAN/gan.png create mode 100644 vision/mnist/cGAN/cGAN.jpg create mode 100644 vision/mnist/cGAN/cgan.jl create mode 100644 vision/mnist/cGAN/cgan.md create mode 100644 vision/mnist/cGAN/sample_cgan.png diff --git a/vision/mnist/DCGAN/GAN-1.jpg b/vision/mnist/DCGAN/GAN-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a33b3fadf445e3275f99dbdaf68807f3a3e5d1f2 GIT binary patch literal 44880 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 c>|bs8Qbm10r&UV#7qU;p@P@aOmc1KvRSnE(I) literal 0 HcmV?d00001 diff --git a/vision/mnist/DCGAN/dcgan.jl b/vision/mnist/DCGAN/dcgan.jl new file mode 100644 index 000000000..8871860ab --- /dev/null +++ b/vision/mnist/DCGAN/dcgan.jl @@ -0,0 +1,157 @@ +# Get the imports done +using Flux, Flux.Data.MNIST +using Flux: @epochs, back!, testmode!, throttle +using Base.Iterators: partition +using Distributions: Uniform,Normal +using CUDAnative: tanh, log, exp +using CuArrays +using Images +using Statistics + +# Define the hyperparameters +BATCH_SIZE = 128 +NUM_EPOCHS = 15 +noise_dim = 100 +channels = 128 +hidden_dim = 7 * 7 * channels +training_steps = 0 +verbose_freq = 100 +dis_lr = 0.0001f0 # Discriminator Learning Rate +gen_lr = 0.0001f0 # Generator Learning Rate + +# Loading Data + +# We use Flux's built in MNIST Loader +imgs = MNIST.images() + +# Partition into batches of size 'BATCH_SIZE' +data = [reshape(float(hcat(vec.(imgs)...)),28,28,1,:) for imgs in partition(imgs, BATCH_SIZE)] + +# Define out distribution for random sampling for the generator to sample noise from +dist = Normal(0.0,1.0) # Standard Normal noise is found to give better results + +expand_dims(x,n::Int) = reshape(x,ones(Int64,n)...,size(x)...) +squeeze(x) = dropdims(x, dims = tuple(findall(size(x) .== 1)...)) + +# The Generator +generator = Chain( + Dense(noise_dim, 1024, leakyrelu), + x->expand_dims(x,1), + BatchNorm(1024), + x->squeeze(x), + Dense(1024, hidden_dim, leakyrelu), + x->expand_dims(x,1), + BatchNorm(hidden_dim), + x->squeeze(x), + x->reshape(x,7,7,channels,:), + ConvTranspose((4,4), channels=>64, relu; stride=(2,2), pad=(1,1)), + x->expand_dims(x,2), + BatchNorm(64), + x->squeeze(x), + ConvTranspose((4,4), 64=>1, tanh; stride=(2,2), pad=(1,1)) + ) |> gpu + +# The Discriminator +discriminator = Chain( + Conv((3,3), 1=>32, leakyrelu;pad = 1), + x->meanpool(x, (2,2)), + Conv((3,3), 32=>64, leakyrelu;pad = 1), + x->meanpool(x, (2,2)), + x->reshape(x,7*7*64,:), + Dense(7*7*64, 1024, leakyrelu), + x->expand_dims(x,1), + BatchNorm(1024), + x->squeeze(x), + Dense(1024, 1,sigmoid) + ) |> gpu + +# Define the optimizers + +opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) +opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) + +# Utility functions to zero out our model gradients +function nullify_grad!(p) + if typeof(p) <: TrackedArray + p.grad .= 0.0f0 + end + return p +end + +function zero_grad!(model) + model = mapleaves(nullify_grad!, model) +end + +# Creating and Saving Utilities + +img(x) = Gray.(reshape((x+1)/2, 28, 28)) # For denormalizing the generated image + +function sample() + noise = [rand(dist, noise_dim, 1) for i=1:9] # Sample 9 digits + noise = gpu.(noise) # Add to GPU + + testmode!(generator) + fake_imgs = img.(map(x -> gpu(generator(x).data), noise)) # Generate a new image from random noise + testmode!(generator, false) + + img_grid = vcat([hcat(imgs...) for imgs in partition(fake_imgs, 3)]...) # Create grid for saving +end + +cd(@__DIR__) + + +# We use the Binary Cross Entropy Loss +function bce(ŷ, y) + mean(-y.*log.(ŷ) - (1 .- y .+ 1f-10).*log.(1 .- ŷ .+ 1f-10)) +end + +function train(x) + global training_steps + println("TRAINING") + z = rand(dist, noise_dim, BATCH_SIZE) |> gpu + inp = 2x .- 1 |> gpu # Normalize images to [-1,1] + + zero_grad!(discriminator) + + D_real = discriminator(inp) # D(x) + real_labels = ones(size(D_real)) |> gpu + + + D_real_loss = bce(D_real,real_labels) + + fake_x = generator(z) # G(z) + D_fake = discriminator(fake_x) # D(G(z)) + fake_labels = zeros(size(D_fake)) |> gpu + + D_fake_loss = bce(D_fake,fake_labels) + + D_loss = D_real_loss + D_fake_loss + Flux.back!(D_loss) + opt_disc() # Optimize the discriminator + + zero_grad!(generator) + + fake_x = generator(z) # G(z) + D_fake = discriminator(fake_x) # D(G(z)) + real_labels = ones(size(D_fake)) |> gpu + + G_loss = bce(D_fake,real_labels) + + Flux.back!(G_loss) + opt_gen() # Optimise the generator + + if training_steps % verbose_freq == 0 + println("D Loss: $(D_loss.data) | G loss: $(G_loss.data)") + end + + training_steps += 1 +end + +for e = 1:NUM_EPOCHS + for imgs in data + train(imgs) + end + println("Epoch $e over.") +end + +save("sample_dcgan.png", sample()) diff --git a/vision/mnist/DCGAN/dcgan.md b/vision/mnist/DCGAN/dcgan.md new file mode 100644 index 000000000..0c8dc44d3 --- /dev/null +++ b/vision/mnist/DCGAN/dcgan.md @@ -0,0 +1,24 @@ +# Generative Adversarial Network Tutorial + +Generative Adversarial Nets (GAN), are generative models used to infer a complicated probability distribution. + +We have two networks competing against each other - The Generator and the discriminator. + +![GAN](GAN-1.jpg) + +The first net generates data from randomly sampled noise, and the second net tries to tell the difference between the real data and the fake data generated by the first net. + +The formulation per se involves the following min-max objective : + +![gan_loss](gan.png) + +At equilibrium, the discriminator will output a probability of 0.5 for each generated image. + +## Run the script + +``` +julia dcgan.jl +``` + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/vision/mnist/DCGAN/frames.pdf b/vision/mnist/DCGAN/frames.pdf new file mode 100644 index 0000000000000000000000000000000000000000..555d28d8b7f2678a94a979c8c488254ff04f95e7 GIT binary patch literal 20722 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 Vf+JB_*#+iP1|$w;^vv~l{|}%X@KOK( literal 0 HcmV?d00001 diff --git a/vision/mnist/DCGAN/gan.png b/vision/mnist/DCGAN/gan.png new file mode 100644 index 0000000000000000000000000000000000000000..ff779d0d4b64aa678442a55aba581c09005e9059 GIT binary patch literal 26884 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 gpu +train_imgs = MNIST.images()[1:100] |> gpu + +# Bundle images together with labels and group into minibatches +function make_minibatch(X, Y, idxs) + X_batch = Array{Float32}(undef, 784, length(idxs)) + for i in 1:length(idxs) + X_batch[:, i] = Float32.(reshape(X[idxs[i]],784)) + end + Y_batch = onehotbatch(Y[idxs], 0:9) + return vcat(X_batch, Y_batch) +end + +mb_idxs = partition(1:length(train_imgs), BATCH_SIZE) +train_set = [make_minibatch(train_imgs, train_labels, i) for i in mb_idxs] + +# Define out distribution for random sampling for the generator to sample noise from +dist = Normal(0.0,1.0) # Standard Normal noise is found to give better results + +# The Generator +generator = Chain(Dense(NOISE_DIM + 10,1200,leakyrelu), + Dense(1200,1000,leakyrelu), + Dense(1000,784,tanh) + ) |> gpu + +# The Discriminator +discriminator = Chain(Dense(794,512,leakyrelu), + Dense(512,128,leakyrelu), + Dense(128,1,sigmoid) + ) |> gpu + +# Define the optimizers +opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) +opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) + +# Utility functions to zero out our model gradients +function nullify_grad!(p) + if typeof(p) <: TrackedArray + p.grad .= 0.0f0 + end + return p +end + +function zero_grad!(model) + model = mapleaves(nullify_grad!, model) +end + +# Creating and Saving Utilities + +img(x) = Gray.(reshape((x.+1)/2, 28, 28, 1)) # For denormalizing the generated image + +function sample() + num_samples = 9 # Number of digits to sample + fake_labels = zeros(10,num_samples) + for i in 1:num_samples + fake_labels[rand(1:9),i] = 1 + end + + noise = [vcat(rand(dist, NOISE_DIM, 1),fake_labels[:,i]) for i=1:num_samples] # Sample 9 digits + noise = gpu.(noise) # Add to GPU + + testmode!(generator) + fake_imgs = img.(map(x -> gpu(generator(x).data), noise)) # Generate a new image from random noise + testmode!(generator, false) + + img_grid = fake_imgs[1] +end + +cd(@__DIR__) + +# We use the Binary Cross Entropy Loss +function bce(ŷ, y) + mean(-y.*log.(ŷ .+ 1f-10) - (1 .- y .+ 1f-10).*log.(1 .- ŷ .+ 1f-10)) +end + +function train(x) + global training_steps + + z = rand(dist,NOISE_DIM, BATCH_SIZE) |> gpu + inp = 2x .- 1 |> gpu # Normalize images to [-1,1] + inp[end-9:end,:] = x[end-9:end,:] # The labels should not be modified + + labels = Float32.(x[end-9:end,:]) |> gpu # y + zero_grad!(discriminator) + zero_grad!(generator) + + D_real = discriminator(inp) # D(x|y) + real_labels = ones(size(D_real)) |> gpu + + D_real_loss = bce(D_real,real_labels) + + fake_x = generator(vcat(z,labels)) # G(z|y) + D_fake = discriminator(vcat(fake_x,labels)) # D(G(z|y)) + fake_labels = zeros(size(D_fake)) |> gpu + + D_fake_loss = bce(D_fake,fake_labels) + + D_loss = D_real_loss + D_fake_loss + Flux.back!(D_loss) + opt_disc() # Optimize the discriminator + + zero_grad!(discriminator) + zero_grad!(generator) + + fake_x = generator(vcat(z,labels)) # G(z|y) + D_fake = discriminator(vcat(fake_x,labels)) # D(G(z|y)) + real_labels = ones(size(D_fake)) |> gpu + + G_loss = bce(D_fake,real_labels) + Flux.back!(G_loss) + opt_gen() # Optimise the generator + + if training_steps % verbose_freq == 0 + println("D Loss: $(D_loss.data) | G loss: $(G_loss.data)") + end + + println(training_steps) + training_steps += 1 +end + +for e = 1:NUM_EPOCHS + for data in train_set + train(data) + end + println("Epoch $e over.") +end + +save("sample_cgan.png", sample()) \ No newline at end of file diff --git a/vision/mnist/cGAN/cgan.md b/vision/mnist/cGAN/cgan.md new file mode 100644 index 000000000..e90f95ae3 --- /dev/null +++ b/vision/mnist/cGAN/cgan.md @@ -0,0 +1,16 @@ +# Conditional Generative Adversarial Network Tutorial + +A cGAN is a GAN wherein both the generator and the discriminator are fed prior labels along with the image and random noise. + +It models the conditional probabilities conditioned on the labels. + +![cGAN](cGAN.jpg) + +## Run the script + +``` +julia cgan.jl +``` + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/vision/mnist/cGAN/sample_cgan.png b/vision/mnist/cGAN/sample_cgan.png new file mode 100644 index 0000000000000000000000000000000000000000..93ee2f0637896af36c08ee1769e86383039b97d1 GIT binary patch literal 796 zcmV+%1LOROP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt0+~rfK~yNuCC<%j9Ca86@bC9|p5N~`yPKKa>}XWN(4LA11#kA?St%Y3UIY*IqEdXpdX(Y|rBIM66{VCSriiAAn(StG zW_D*h`1uPy@Ug@~f@I`Od!V!g4$VW@3lQ+9JcYhbM=!L4fH@I~0eV~1Q1dlKltMsj zB+kbH0MbAQQiKE`y9BBdtAYeX5cNm^Y_moJqO(u|MYNZflY!Zkjbc21uzvda?9lj; z*KQRRy4yO8atVb}D#uf2URgMH;z2vT&{kS?vCOWbKn= zVQu6!9ZqW*%TUE{_FsDE?eA`8mv=pV&#tC}%IoHYjqQ@5yD(_Iduw^$M~CIo@XG3F zoL4y@sv@>u?D(@!cDf;Lzc>7`K?o#38-$2=l%sbxub$qYT>R(L^QN@joC67XM}l*! z|K5IK{`2whtQVjkAp+STnlV8Aa%XaX=a2XM2SAbp(S#a1P-SCu`y(oH-BY^DM& zOVsnS;uO`%^sD&eOV-XZMTM-EOEkm1Gq93){P5Dn&E=(sKDWw{O$OdZWqNliI&sm3 zm1uRQTjxgRqHUmLF8i=Cbu2V|J@>(-Vx4}t4&NGIrm$l=f57 z99OMB-Ijv@inw+3!#lmX{_5qQAEQ9q06_`>_??yJgYuc}6VbU3rd8mv!3=~EpbgaE z!%x3$z4gW2Yd4-EV)GCrCIH0LwDrcl;jsAj_tz;T0_dqG0L5Y_ombbke);T-_kuu* zp~EK7fOFbGGP`g@|1VIH0KyIctt(7ufkrWsf*?-3Cq;W%qO7FKJKk&>Dn!hxJy Date: Thu, 11 Apr 2019 21:38:55 +0530 Subject: [PATCH 2/4] Remove HTML tags --- vision/mnist/DCGAN/dcgan.jl | 8 ++++---- vision/mnist/cGAN/cgan.jl | 24 ++++++++++++------------ vision/mnist/cGAN/sample_cgan.png | Bin 796 -> 929 bytes 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/vision/mnist/DCGAN/dcgan.jl b/vision/mnist/DCGAN/dcgan.jl index 8871860ab..3c82ee921 100644 --- a/vision/mnist/DCGAN/dcgan.jl +++ b/vision/mnist/DCGAN/dcgan.jl @@ -65,12 +65,12 @@ discriminator = Chain( Dense(1024, 1,sigmoid) ) |> gpu -# Define the optimizers +# Define the optimizers opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) -# Utility functions to zero out our model gradients +# Utility functions to zero out our model gradients function nullify_grad!(p) if typeof(p) <: TrackedArray p.grad .= 0.0f0 @@ -82,7 +82,7 @@ function zero_grad!(model) model = mapleaves(nullify_grad!, model) end -# Creating and Saving Utilities +# Creating and Saving Utilities img(x) = Gray.(reshape((x+1)/2, 28, 28)) # For denormalizing the generated image @@ -100,7 +100,7 @@ end cd(@__DIR__) -# We use the Binary Cross Entropy Loss +# We use the Binary Cross Entropy Loss function bce(ŷ, y) mean(-y.*log.(ŷ) - (1 .- y .+ 1f-10).*log.(1 .- ŷ .+ 1f-10)) end diff --git a/vision/mnist/cGAN/cgan.jl b/vision/mnist/cGAN/cgan.jl index 1fbaa78fc..2b481e2df 100644 --- a/vision/mnist/cGAN/cgan.jl +++ b/vision/mnist/cGAN/cgan.jl @@ -49,11 +49,11 @@ discriminator = Chain(Dense(794,512,leakyrelu), Dense(128,1,sigmoid) ) |> gpu -# Define the optimizers +# Define the optimizers opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) -# Utility functions to zero out our model gradients +# Utility functions to zero out our model gradients function nullify_grad!(p) if typeof(p) <: TrackedArray p.grad .= 0.0f0 @@ -65,7 +65,7 @@ function zero_grad!(model) model = mapleaves(nullify_grad!, model) end -# Creating and Saving Utilities +# Creating and Saving Utilities img(x) = Gray.(reshape((x.+1)/2, 28, 28, 1)) # For denormalizing the generated image @@ -78,17 +78,17 @@ function sample() noise = [vcat(rand(dist, NOISE_DIM, 1),fake_labels[:,i]) for i=1:num_samples] # Sample 9 digits noise = gpu.(noise) # Add to GPU - + testmode!(generator) fake_imgs = img.(map(x -> gpu(generator(x).data), noise)) # Generate a new image from random noise testmode!(generator, false) - + img_grid = fake_imgs[1] end cd(@__DIR__) -# We use the Binary Cross Entropy Loss +# We use the Binary Cross Entropy Loss function bce(ŷ, y) mean(-y.*log.(ŷ .+ 1f-10) - (1 .- y .+ 1f-10).*log.(1 .- ŷ .+ 1f-10)) end @@ -106,13 +106,13 @@ function train(x) D_real = discriminator(inp) # D(x|y) real_labels = ones(size(D_real)) |> gpu - + D_real_loss = bce(D_real,real_labels) fake_x = generator(vcat(z,labels)) # G(z|y) D_fake = discriminator(vcat(fake_x,labels)) # D(G(z|y)) fake_labels = zeros(size(D_fake)) |> gpu - + D_fake_loss = bce(D_fake,fake_labels) D_loss = D_real_loss + D_fake_loss @@ -121,15 +121,15 @@ function train(x) zero_grad!(discriminator) zero_grad!(generator) - + fake_x = generator(vcat(z,labels)) # G(z|y) D_fake = discriminator(vcat(fake_x,labels)) # D(G(z|y)) real_labels = ones(size(D_fake)) |> gpu - + G_loss = bce(D_fake,real_labels) Flux.back!(G_loss) opt_gen() # Optimise the generator - + if training_steps % verbose_freq == 0 println("D Loss: $(D_loss.data) | G loss: $(G_loss.data)") end @@ -145,4 +145,4 @@ for e = 1:NUM_EPOCHS println("Epoch $e over.") end -save("sample_cgan.png", sample()) \ No newline at end of file +save("sample_cgan.png", sample()) \ No newline at end of file diff --git a/vision/mnist/cGAN/sample_cgan.png b/vision/mnist/cGAN/sample_cgan.png index 93ee2f0637896af36c08ee1769e86383039b97d1..4040d4abd538de396441ccd1b61cc0067903b326 100644 GIT binary patch delta 833 zcmV-H1HSy62B8O#ZGQtENkl>!xiwq;ytF86f32=#@v|xEBX^em;gT zRAQCpp4j9FSKnzyA17_BOZGfhJ{VC&5ODryI~@=~M59{V=6{o{(!@p%CLnpfUsl1# z8@d>fswTub7)XvI7cTS%gkaX#g!KrXm?wV*3x16(;IW8E<^%Y{2jwC0?q%Q^3DyTb zeZgVj&+Ppe?Gs58|7{R{)M`-eOb+kjK5<>hn<796XuVvF}4@QvLK8CtFT=w zA>#zxNHk_F`+pKT8Y*v39H+vNnp=Xp z{KVa%?xEqFwx7YoV#x4!_E?0#hvVzc6-TKzW$J3}fRMN;13^e8|4I(yz~42wKJra9dy^JpwSQUocBC4$@6So_RQUw1Fs;8j z1yH=!hp#8GJ*!YD*v!^LZKy`AZrP*oyN{n-;r|O z#6Opf(Ej99SEs|$CUuRb| zKGIlVR(}Xu{c)=e;qIARAYFDC{D){5X*FAtN`@zPN)UZT7k z0wZGQrpNklD=fnceJcx|?nr`lggr zQc5Z4p(3$`B83uB6!g%ZiU$R6_TX759t~au5A~u_e8GB@;tQovkSZ0Wlp>~xriq&D zW_M#L)Z%t@TWY5zE4Llw10zuIT48gdRx>`^EE}3 zLO^RI&c^`&(m)4NgajbF1ga9Nf&@em^+*70vql1)oRx|BINt-ow5-<;c7?EZaZ z?UQ6-ZR9l_PJe3|%TUE{_FsDE?eA`8mv=pV&#tC}%IoHYjqQ@5yD(_Iduw^$M~CIo z@XG3FoL4y@sv@>u?D(@!cDf;Lzc>7`K?o#38-$2=l%sbxub$qYT>R(L^QN@joC67X zM}l*!|K5IK{`2whtQVjkAp+STnlV8Aa%XaX=a2XM2Y*141kr>VgNTVe_g9rYywXiP z1Z<`PElbq%vf>og$@HuE<4e}gGDU@~mP<6ly)&?qc>M6v#m(iVhd#H;kWB{OMrC?; zDmrn|g_US^rd#Jm=Avz&WG?%#F?B37d_DKWi{GyoBe%gxLC!OVte3Upq7prEZO`>$ zw2Y)Et$!R>tv}tCg8+)Sb@anKy}ADC<)0s;K-&O83IO<>mF9!;ne7wNxeumQ;IY9B zgb|<()ZoKUziqws#ocQ+o+4uN5F{o5#MHF)#=YUN`1beLDI@~usU`r$Vkezf*S3E7 z?2Pw}$_4gjqyOf+bLMlq6tAWpm|MSEGItfb02-fS8w hM9iu^SS*%i{{tjk#gYNK_!R&E002ovPDHLkV1ms;VBY`$ From 023349ca8ec25a81c0087374bcc472f00f58cde5 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Sat, 13 Apr 2019 10:18:03 +0530 Subject: [PATCH 3/4] Removed back, added gradient --- vision/mnist/DCGAN/dcgan.jl | 43 +++++++++++++++++------------- vision/mnist/cGAN/cgan.jl | 23 ++++++++++------ vision/mnist/cGAN/sample_cgan.png | Bin 929 -> 954 bytes 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/vision/mnist/DCGAN/dcgan.jl b/vision/mnist/DCGAN/dcgan.jl index 3c82ee921..54a448c70 100644 --- a/vision/mnist/DCGAN/dcgan.jl +++ b/vision/mnist/DCGAN/dcgan.jl @@ -67,20 +67,22 @@ discriminator = Chain( # Define the optimizers -opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) -opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) +# opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) +# opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) +opt_gen = ADAM(gen_lr) +opt_disc = ADAM(dis_lr) # Utility functions to zero out our model gradients -function nullify_grad!(p) - if typeof(p) <: TrackedArray - p.grad .= 0.0f0 - end - return p -end +# function nullify_grad!(p) +# if typeof(p) <: TrackedArray +# p.grad .= 0.0f0 +# end +# return p +# end -function zero_grad!(model) - model = mapleaves(nullify_grad!, model) -end +# function zero_grad!(model) +# model = mapleaves(nullify_grad!, model) +# end # Creating and Saving Utilities @@ -111,7 +113,7 @@ function train(x) z = rand(dist, noise_dim, BATCH_SIZE) |> gpu inp = 2x .- 1 |> gpu # Normalize images to [-1,1] - zero_grad!(discriminator) + # zero_grad!(discriminator) D_real = discriminator(inp) # D(x) real_labels = ones(size(D_real)) |> gpu @@ -126,19 +128,24 @@ function train(x) D_fake_loss = bce(D_fake,fake_labels) D_loss = D_real_loss + D_fake_loss - Flux.back!(D_loss) - opt_disc() # Optimize the discriminator + gs = Tracker.gradient(() -> D_loss,params(discriminator)) + update!(opt_disc,params(discriminator),gs) + # Flux.back!(D_loss) + # opt_disc() # Optimize the discriminator - zero_grad!(generator) + # zero_grad!(generator) fake_x = generator(z) # G(z) D_fake = discriminator(fake_x) # D(G(z)) real_labels = ones(size(D_fake)) |> gpu G_loss = bce(D_fake,real_labels) - - Flux.back!(G_loss) - opt_gen() # Optimise the generator + gs = Tracker.gradient(() -> G_loss,params(generator)) + for _ in 1:3 + update!(opt_gen,params(generator),gs) + end + # Flux.back!(G_loss) + # opt_gen() # Optimise the generator if training_steps % verbose_freq == 0 println("D Loss: $(D_loss.data) | G loss: $(G_loss.data)") diff --git a/vision/mnist/cGAN/cgan.jl b/vision/mnist/cGAN/cgan.jl index 2b481e2df..cd9d93b77 100644 --- a/vision/mnist/cGAN/cgan.jl +++ b/vision/mnist/cGAN/cgan.jl @@ -1,6 +1,7 @@ # Get the imports done using Flux, Flux.Data.MNIST,Flux -using Flux: @epochs, back!, testmode!, throttle +using Flux: @epochs, back!, testmode!, throttle, Tracker +using Flux.Tracker:update! using Base.Iterators: partition,flatten using Flux: onehot,onehotbatch using Distributions: Normal @@ -8,7 +9,7 @@ using Statistics using Images # Define the hyperparameters -NUM_EPOCHS = 5000 +NUM_EPOCHS = 500 BATCH_SIZE = 100 NOISE_DIM = 100 gen_lr = 0.0001f0 # Generator learning rate @@ -50,8 +51,8 @@ discriminator = Chain(Dense(794,512,leakyrelu), ) |> gpu # Define the optimizers -opt_gen = ADAM(params(generator),gen_lr, β1 = 0.5) -opt_disc = ADAM(params(discriminator),dis_lr, β1 = 0.5) +opt_gen = ADAM(gen_lr) +opt_disc = ADAM(dis_lr) # Utility functions to zero out our model gradients function nullify_grad!(p) @@ -116,8 +117,10 @@ function train(x) D_fake_loss = bce(D_fake,fake_labels) D_loss = D_real_loss + D_fake_loss - Flux.back!(D_loss) - opt_disc() # Optimize the discriminator + # Flux.back!(D_loss) + # opt_disc() # Optimize the discriminator + gs = Tracker.gradient(() -> D_loss,params(discriminator)) + update!(opt_disc,params(discriminator),gs) zero_grad!(discriminator) zero_grad!(generator) @@ -127,8 +130,12 @@ function train(x) real_labels = ones(size(D_fake)) |> gpu G_loss = bce(D_fake,real_labels) - Flux.back!(G_loss) - opt_gen() # Optimise the generator + # Flux.back!(G_loss) + # opt_gen() # Optimise the generator + gs = Tracker.gradient(() -> G_loss,params(generator)) + for _ in 1:3 + update!(opt_gen,params(generator),gs) + end if training_steps % verbose_freq == 0 println("D Loss: $(D_loss.data) | G loss: $(G_loss.data)") diff --git a/vision/mnist/cGAN/sample_cgan.png b/vision/mnist/cGAN/sample_cgan.png index 4040d4abd538de396441ccd1b61cc0067903b326..c50de518e7e20ea1ffa2d9f497e27646219dea5d 100644 GIT binary patch delta 857 zcmV-f1E&0;2f7E4ZhtpPL_t(2&jBn0)BFPx0tf{V6Pm)KDa|EedJRd;R@`;#ZusgPMly68~C0~1rS)&A|_29Fu4==~4!#{lB} zNZkDbBsA3B_y7|J5I6-4BL^BHU!4YD7<+yQMG^)hIS&yUY=0;N0sjK+7V>kz1P9K} zjpGTy;V;Vn9PK&Y`TyE^0wM+zlkP^16MmutR(MIylx6=G0}^_%DHsv}I z3@+NXZouSml7EOy19I~gGiV0#Q3dd#mrb}zng9g82^blik0cBsFd?rsft?^aYwej2 z6?qE{6Db2WD7^~xyTSFO^+5*X*P_ku?c-Ci(nQSf`$o|N@UtY@Xn|}@D2)qI?^=<$Tb|X&-D;Ad? zI}O_=yco&mF{mFjP*FV@22T+K{q*Gn=FaS!GT@zET`eJj+)#e*Z@A~$1^apZ01G2H zAB_uG9~f{KAb3ePlhF|^NF-6y3=0h|3<3d3-lKRk1i2Q=SY1|%@$3f#><9_NLIgtj z-Vp?BrGHOa2~pvU`&xn#>+&B|Pi!)H4GccNy#WAl0-*2m8vN;=`Hl(6QVnMAO$8IF z5*+rp>0KKFtO5%G72pic6tee)yO{H3^0^q5;84jJZ40LHGtdDf_D8tw1txFPNTP#? z4EF4R3QPHd_-+GYp$G>8TWqHESRE7p=EnBC(tkFszC&q=Benwr9;2!K?f?@Gl}@K2 zU}i41I-cY%jEO@Q3k?ef4n-Cd4F>~b$i?Nr0@KwxP?%z7P8aNU1nLbE`1%Fr`Tqa_ ziixrfArJ^Y*c?JHEIYk)77M`%3kwVd%LNN#00{{cS`GyV5e*zSZ46`=J_eEx3>^j> z2vU7+8#V$t0SCMJVNWS+3f}z$a_}etfCl*i3K~kmo&Vbc#3=x4K0CwPmJ9(I_&O1= jC=dDs^k3o{bp`GKd8|;pIsi=n00000NkvXXu0mjf?U`X_ delta 832 zcmV-G1Hb&b2cZX$Zhsz0L_t(2&jrEzZyI#~0Py3!cR;!0;EvbvD1!p!(e;gW*=Svr zxMk5aCf1nvgTMQ`{uTb9e}nNiW2VWB)0w90rfoW;bXH0kAmupdl}F*Y7YBEKK87z; zVwL8e*yIRT-)Tl4CvB`t_B>ZU7*RzKaQ8*` zx)_kECd4`zNRA^HF7yY4VAj}#^$4DrCw~SDevK^Pv4}|K1Ng%SQZ4iFcYEbP=4^Df|;>EU%zhg#+orAR#=8vy2wim^+AdCX5uw5%5 z;{@DDG-fRO5`Q`xDsN97ujfz(25tj{aoeI)@a04^9GjmtBY~1^^9l><0r)bSTY|d$ z#NDCpq2ZjipTWdp$nbaeScJfbT2zPkhm!WK}aV5N)F?|-%TY{fk@T$ zt!7*DxGU4lVY4eZy*AznK9{R+VnNY9@=Y~+lNMvOS%3I;q#CvF&q?r9`2?;ot-m@2 zP`uWMuP3oR%lYL}qifV45O+Rx-KFzu>-=q}t@tS_|FCmHp(UIkYYDKO#?DjUk#gR| zKbMWs0s;<0)g2mt8Pz55)kSzjST-mgD@IK-!>zm?NJdUpezp$l0g#?8l4m+!XIC^n z(pX?t2!C4rajOmC?wMO4U3M7!hiDjSJI7vC9AAz`*UPD&kPzPx;FDOH{&z*CELJ5r zW{o2na@~Tyc}r&|r#G`;XX4FW6Y@1cUr6hVHeox&~8aM3mwv{_q z%7I&nl$iW<(-xUlz(?vvddW*+`S1m7x|AgQwN@BM(2n1Bc=vqRnh0000< KMNUMnLSTYv9FZ~r From e99a30c6b950034762bf4b7639f441ee74658234 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Sat, 13 Apr 2019 12:23:14 +0530 Subject: [PATCH 4/4] Removed zero_grad from cgan --- vision/mnist/cGAN/cgan.jl | 8 ++++---- vision/mnist/cGAN/sample_cgan.png | Bin 954 -> 426 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vision/mnist/cGAN/cgan.jl b/vision/mnist/cGAN/cgan.jl index cd9d93b77..c0b317414 100644 --- a/vision/mnist/cGAN/cgan.jl +++ b/vision/mnist/cGAN/cgan.jl @@ -102,8 +102,8 @@ function train(x) inp[end-9:end,:] = x[end-9:end,:] # The labels should not be modified labels = Float32.(x[end-9:end,:]) |> gpu # y - zero_grad!(discriminator) - zero_grad!(generator) + # zero_grad!(discriminator) + # zero_grad!(generator) D_real = discriminator(inp) # D(x|y) real_labels = ones(size(D_real)) |> gpu @@ -122,8 +122,8 @@ function train(x) gs = Tracker.gradient(() -> D_loss,params(discriminator)) update!(opt_disc,params(discriminator),gs) - zero_grad!(discriminator) - zero_grad!(generator) + # zero_grad!(discriminator) + # zero_grad!(generator) fake_x = generator(vcat(z,labels)) # G(z|y) D_fake = discriminator(vcat(fake_x,labels)) # D(G(z|y)) diff --git a/vision/mnist/cGAN/sample_cgan.png b/vision/mnist/cGAN/sample_cgan.png index c50de518e7e20ea1ffa2d9f497e27646219dea5d..f824cecdd7bdbe38ec4e4bfb3fba7fd4992d1783 100644 GIT binary patch delta 326 zcmV-M0lEIV2dV>*ZGQnLNklRe$) zD;w7|r4fMZpuUwNg3R4=o7%jmL|1l7la`@0xX0({u&h; zfCuI`0|^Q!VBTPP1kvmd54fWk`qC5l%j)Ml%ev@L!UGdiveo|W;RcTxs_6X>^2Y$; z{Yc#X0wgrl-S_|#2M{;~3?l~`B43>bUl@CS2t^VGBRLNd8h>mk0|Ea6?H2NLzyt@* z&W+;*E^6O-;njT3&N16FuR&Xi^U76TG`u_+i50OSJz_Zd8U zwo~7{rZE8as15rtnN6Ldd1o@NME)NJz z0}L+Owr;@WaetDCOapTB7BgrD@=*owqL)p$N}2!!z6lr^oR1_7Auu7YHG!QVI&1Bj z4;6U}4HGE?HYmLc^}E6Kr1e1t4$@B2p41MsyZ-YM(^Bck`^WK%W` zaVhcj{vY1RIn)H@2m%Q=-UA&5`3nWB-erFart4xJ3V)jon1Ln@`n=;^?U0p39f!t7j?r*r~+6DW0{QwIi zI3JA*SRWX07a({^Hmi*Yd$-}+m;Lg8TdL8 kuqY4u1oU6x8g&Kk0C}uXygC3({{R3007*qoM6N<$f(Qa(ZU6uP