Skip to content

Instantly share code, notes, and snippets.

@ekinakyurek
Last active October 15, 2018 03:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ekinakyurek/d16c64567dbec61d82783df8f346dd6a to your computer and use it in GitHub Desktop.
Save ekinakyurek/d16c64567dbec61d82783df8f346dd6a to your computer and use it in GitHub Desktop.
GAN Notebook
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GAN-70-Lines-of-Julia \n",
"This notebook is a demonstration for a simple GAN training on MNIST by using Julia. It will highlight how one can program a machine learning model in Julia as if just writing a paper. Let's get started!"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup\n",
"We will use the deep learning package Knet.jl to compute gradients for the networks and use GPU arrays if a gpu device is available."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"┌ Warning: `Pkg.dir(pkgname, paths...)` is deprecated; instead, do `import Knet; joinpath(dirname(pathof(Knet)), \"..\", paths...)`.\n",
"└ @ Pkg.API /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.0/Pkg/src/API.jl:472\n"
]
},
{
"data": {
"text/plain": [
"KnetArray{Float32,N} where N"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"using Pkg; for p in (\"Knet\",\"Colors\",\"Images\",\"ImageMagick\"); haskey(Pkg.installed(),p) || Pkg.add(p); end #installs required packages\n",
"using Knet, Colors, Images, Statistics\n",
"include(Pkg.dir(\"Knet\",\"data\",\"mnist.jl\")) #MNIST data loader functions\n",
"global atype = gpu() >= 0 ? KnetArray{Float32} : Array{Float32}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## MLP Model \n",
"Both for Generator and Discriminator, generic multilayer perceptrons are needed. $\\mathbf{w}$ is an array that keeps the model paramaters and $\\mathbf{x}$ is the input. Keyword argument $\\mathbf{p}$ is the dropout probability, `activation` is the activation function used in the hidden layers, and `outputactivation` is the activation function used in the output layer. We also define `elu` activation function."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"mlp (generic function with 1 method)"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function mlp(w,x;p=0.0,activation=elu,outputactivation=sigm)\n",
" for i=1:2:length(w)\n",
" x = w[i]*dropout(mat(x),p) .+ w[i+1] # mat() used for flattening images to a vector.\n",
" i<length(w)-1 && (x = activation.(x)) \n",
" end\n",
" return outputactivation.(x) #output layer\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discriminator and Generator Networks\n",
"\n",
"Discriminator and Generator networks are defined as `D` and `G` respectively. Loss functions `𝑱d` and `𝑱g` are defined according to the equation X in GAN paper. Sample noise function `𝒩` is a normal distribution. Loss functions are defined according to the equations in Algorithm 1 section of the [paper](https://arxiv.org/abs/1406.2661 \"arXiv\"). We use a slightly modified generator loss according to [GAN tricks](https://github.com/soumith/ganhacks#2-a-modified-loss-function \"GAN Tricks\").\n",
"$$ J_d = -\\frac{1}{m} \\sum_{i=1}^{m} log(D(x^{(i)}) + log(1-D(G(z^{(i)})))$$\n",
"$$ J_g = -\\frac{1}{m} \\sum_{i=1}^{m} log(D(G(z^{(i)}))) $$ \n",
"\n",
"*`𝜀` is used to prevent log functions from resulting NaN values.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"𝒩 (generic function with 1 method)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"global const 𝜀=Float32(1e-8)\n",
"D(w,x;p=0.0) = mlp(w,x;p=p)\n",
"G(w,z;p=0.0) = mlp(w,z;p=p) \n",
"𝑱d(𝗪d,x,Gz) = -mean(log.(D(𝗪d,x) .+ 𝜀)+log.((1+𝜀) .- D(𝗪d,Gz)))/2 \n",
"𝑱g(𝗪g, 𝗪d, z) = -mean(log.(D(𝗪d,G(𝗪g,z)) .+ 𝜀)) \n",
"𝒩(input, batch) = atype(randn(Float32, input, batch)) #SampleNoise"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gradient Functions\n",
"\n",
"For backpropogation, we need the derivatives of loss functions according to the model parameters. This is where Knet comes to the scene. The `Knet.grad` function calculates gradient according to the first parameter of any function. So,"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(::getfield(AutoGrad, Symbol(\"#gradfun#8\")){getfield(AutoGrad, Symbol(\"##gradfun#6#7\")){typeof(𝑱g),Int64,Bool}}) (generic function with 1 method)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"∇d = grad(𝑱d) # Discriminator gradient\n",
"∇g = grad(𝑱g) # Generator gradient"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Parameter Initialization\n",
"It is a generic weight initialization function for MLPs. For each layer, it creates a weight matrix and bias vector, then add them to $W$. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"initweights (generic function with 1 method)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function initweights(hidden,input, output)\n",
" 𝗪 = Any[];\n",
" x = input\n",
" for h in [hidden... output]\n",
" push!(𝗪, atype(xavier(h,x)), atype(zeros(h, 1))) #FC Layers weights and bias\n",
" x = h\n",
" end\n",
" return 𝗪 #return model params\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate and Display\n",
"\n",
"This function generates a random `number` of images and displays them."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"generate_and_show (generic function with 1 method)"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function generate_and_show(𝗪,number,𝞗)\n",
" Gz = Array(G(𝗪[1], 𝒩(𝞗[:ginp], number))) .> 0.5\n",
" Gz = reshape(Gz, (28, 28, number))\n",
" L = floor(Int, sqrt(number))\n",
" grid = []\n",
" for i = 1:L:number\n",
" push!(grid, reshape(permutedims(Gz[:,:,i:i+L-1], (2,3,1)), (L*28,28)))\n",
" end\n",
" display(Gray.(hcat(grid...)))\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train & Test Function\n",
"\n",
"This `runmodel` function is implementing training procedure described in GAN paper. It first update discriminator with specified optimizer, then update generator network. Same function can be used in test mode by passing `train` argument as false. In the test mode it calculates losses instead of gradients."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"runmodel (generic function with 1 method)"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function runmodel(𝗪, data, 𝞗; dtst=nothing, optim=nothing, train=false, saveinterval=20)\n",
" gloss = dloss = total=0.0;\n",
" B = 𝞗[:batchsize]\n",
" for i=1:(train ? 𝞗[:epochs] : 1)\n",
" for (x,_) in data\n",
" total+=2B\n",
" Gz = G(𝗪[1], 𝒩(𝞗[:ginp], B)) #Generate Fake Images\n",
" train ? update!(𝗪[2], ∇d(𝗪[2],x,Gz), optim[2]) : (dloss += 2B*𝑱d(𝗪[2], x, Gz))\n",
" \n",
" z=𝒩(𝞗[:ginp],2B) #Sample z from Noise\n",
" train ? update!(𝗪[1], ∇g(𝗪[1], 𝗪[2], z), optim[1]) : (gloss += 2B*𝑱g(𝗪[1],𝗪[2],z)) \n",
" end\n",
" train ? runmodel(𝗪, dtst, 𝞗; train=false) : println((gloss/total, dloss/total))\n",
" i % saveinterval == 0 && generate_and_show(𝗪, 100, 𝞗) # save 10 images\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Run\n",
"We will train our model 80 epochs and display resulted images in each 20 epoch. The log format here is (generator loss, discriminator loss)."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"280×280 Array{Gray{Bool},2} with eltype Gray{Bool}:\n",
" Gray{Bool}(true) Gray{Bool}(true) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(true) Gray{Bool}(true) \n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(true) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(true) \n",
" Gray{Bool}(true) Gray{Bool}(true) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(true) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(true) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(true) \n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(true) \n",
" ⋮ ⋱ \n",
" Gray{Bool}(true) Gray{Bool}(true) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(true) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(true) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(true) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(true) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(true) Gray{Bool}(true) \n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(true) Gray{Bool}(false) Gray{Bool}(false)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"(0.7070182002125642, 0.7129692123868526)\n",
"(2.6972159368869586, 0.14585052000788543)\n",
"(3.1427391599386167, 0.3839751585888175)\n",
"(3.0018755396207175, 0.28540667600165576)\n",
"(2.4193741717399697, 0.25220070901111913)\n",
"(2.714185036145724, 0.2753392961115027)\n",
"(2.3356421414094095, 0.2947772457622565)\n",
"(2.6071833769480386, 0.3119419638115244)\n",
"(2.715550125409395, 0.2807362637697504)\n",
"(2.638071894645691, 0.26305022360518193)\n",
"(3.221586035612302, 0.26055200561546743)\n",
"(3.16395251873212, 0.25307850958779454)\n",
"(3.4526335451847467, 0.1659754699525925)\n",
"(3.8970454449837026, 0.2135153397296866)\n",
"(4.0360427514100685, 0.23753360617690936)\n",
"(4.6163972937143765, 0.28057341661769897)\n",
"(4.7365608276465, 0.25558939514060813)\n",
"(4.162439642808376, 0.2463607530002124)\n",
"(3.903249970613382, 0.22100572519672987)\n",
"(4.283539904997899, 0.32198881942372864)\n",
"("
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"280×280 Array{Gray{Bool},2} with eltype Gray{Bool}:\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" ⋮ ⋱ \n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.9252934891443987, 0.30728288162022066)\n",
"(3.5431383015253606, 0.2915211880507951)\n",
"(3.666312500452384, 0.3384227947785686)\n",
"(3.20049225901946, 0.3302836251946596)\n",
"(3.059357313773571, 0.3308002264597095)\n",
"(2.7812724174597325, 0.3287823430907268)\n",
"(2.928862684048139, 0.34677521089235175)\n",
"(2.652854778827765, 0.33236346766352654)\n",
"(2.6760752544953275, 0.3308630677847526)\n",
"(2.754337956508001, 0.33148658285156274)\n",
"(2.594142747231019, 0.3392050064718112)\n",
"(2.455210806467594, 0.3372390930278179)\n",
"(2.818018090266448, 0.3410037870829304)\n",
"(2.674627593694589, 0.3494075063424997)\n",
"(2.634667009115219, 0.34120393527719456)\n",
"(2.7111851550065555, 0.3536763884461461)\n",
"(2.772063583899767, 0.360814557912258)\n",
"(2.90674651051179, 0.3763349872703354)\n",
"(2.6136230597129235, 0.34049034536553496)\n",
"(2.78036498488524, 0.34493475545866364)\n",
"("
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"280×280 Array{Gray{Bool},2} with eltype Gray{Bool}:\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" ⋮ ⋱ \n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.5133315049684963, 0.33060858864337206)\n",
"(2.8660962528143172, 0.3613075128971384)\n",
"(2.6848798462977777, 0.3406564880353518)\n",
"(2.6033156445393195, 0.33214112032109344)\n",
"(2.7740061657551007, 0.3419588938212165)\n",
"(2.6678343010254397, 0.3305944459369549)\n",
"(2.8780798415342965, 0.33968478178557676)\n",
"(2.811693642383967, 0.33556619439369595)\n",
"(2.8969312050403695, 0.3468700819768203)\n",
"(2.771579799743799, 0.34334640627583635)\n",
"(2.564284560007927, 0.34032854738716894)\n",
"(2.731122597669944, 0.3277671412111093)\n",
"(2.853467990190555, 0.330749364116062)\n",
"(2.7829492466572003, 0.3274786518409084)\n",
"(2.971490354110033, 0.33781160438098967)\n",
"(3.0116113126277924, 0.3454614580871585)\n",
"(3.184412360191345, 0.3593942236680633)\n",
"(2.7643437492541776, 0.3205802728398106)\n",
"(2.9332831425544543, 0.3383164644145813)\n",
"(2.9161910521678434, 0.33831781944116723)\n",
"("
]
},
{
"data": {
"image/png": "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",
"text/plain": [
"280×280 Array{Gray{Bool},2} with eltype Gray{Bool}:\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" ⋮ ⋱ \n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) … Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)\n",
" Gray{Bool}(false) Gray{Bool}(false) Gray{Bool}(false)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"𝞗=Dict(:batchsize=>32,:epochs=>80,:ginp=>256,:genh=>[512],:disch=>[512],:optim=>Adam,:lr=>0.0002);\n",
"xtrn,ytrn,xtst,ytst = mnist()\n",
"global dtrn = minibatch(xtrn, ytrn, 𝞗[:batchsize]; xtype=atype)\n",
"global dtst = minibatch(xtst, ytst, 𝞗[:batchsize]; xtype=atype)\n",
"𝗪 = (𝗪g,𝗪d) = initweights(𝞗[:genh], 𝞗[:ginp], 784), initweights(𝞗[:disch], 784, 1)\n",
"𝚶 = (𝚶pg,𝚶pd) = optimizers(𝗪g, 𝞗[:optim]; lr=𝞗[:lr]), optimizers(𝗪d,𝞗[:optim]; lr=𝞗[:lr])\n",
"generate_and_show(𝗪,100,𝞗)\n",
"runmodel(𝗪, dtst, 𝞗; optim=𝚶, train=false) # initial losses\n",
"runmodel(𝗪, dtrn, 𝞗; optim=𝚶, train=true, dtst=dtst) # training "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.0.1",
"language": "julia",
"name": "julia-1.0"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.0.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment