From 81f6567dac60d78e5f5f4d9c0bcdfab21a48ed86 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Tue, 26 Mar 2019 16:57:57 +0530 Subject: [PATCH] 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