From 1bb54d1c3d46ca7aab8530be568b605fff022709 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 24 Nov 2022 18:49:33 -0500 Subject: [PATCH 01/11] move 5 tutorials from fluxml.github.io --- docs/make.jl | 7 + .../2020-09-15-deep-learning-flux.md | 436 ++++++++++++++++++ docs/src/tutorials/2021-01-26-mlp.md | 169 +++++++ docs/src/tutorials/2021-02-07-convnet.md | 260 +++++++++++ docs/src/tutorials/2021-10-08-dcgan-mnist.md | 363 +++++++++++++++ docs/src/tutorials/2021-10-14-vanilla-gan.md | 280 +++++++++++ docs/src/tutorials/linear_regression.md | 6 +- 7 files changed, 1520 insertions(+), 1 deletion(-) create mode 100755 docs/src/tutorials/2020-09-15-deep-learning-flux.md create mode 100644 docs/src/tutorials/2021-01-26-mlp.md create mode 100644 docs/src/tutorials/2021-02-07-convnet.md create mode 100644 docs/src/tutorials/2021-10-08-dcgan-mnist.md create mode 100644 docs/src/tutorials/2021-10-14-vanilla-gan.md diff --git a/docs/make.jl b/docs/make.jl index 5409a117c7..0847656b9d 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -42,7 +42,14 @@ makedocs( "Functors.jl 📚 (`fmap`, ...)" => "models/functors.md", ], "Tutorials" => [ + # Roughly in order of increasing complexity? Not chronological. "Linear Regression" => "tutorials/linear_regression.md", + "Julia & Flux: 60 Minute Blitz" => "tutorials/2020-09-15-deep-learning-flux.md", + "Multi-layer Perceptron" => "tutorials/2021-01-26-mlp.md", + "Simple ConvNet" => "tutorials/2021-02-07-convnet.md", + "Generative Adversarial Net" => "tutorials/2021-10-14-vanilla-gan.md", + "Deep Convolutional GAN" => "tutorials/2021-10-08-dcgan-mnist.md", + # Not really sure where this belongs... some in Fluxperimental, aim to delete? "Custom Layers" => "models/advanced.md", # TODO move freezing to Training ], "Performance Tips" => "performance.md", diff --git a/docs/src/tutorials/2020-09-15-deep-learning-flux.md b/docs/src/tutorials/2020-09-15-deep-learning-flux.md new file mode 100755 index 0000000000..efd89727c5 --- /dev/null +++ b/docs/src/tutorials/2020-09-15-deep-learning-flux.md @@ -0,0 +1,436 @@ +# Deep Learning with Julia & Flux: A 60 Minute Blitz + +This is a quick intro to [Flux](https://github.com/FluxML/Flux.jl) loosely based on [PyTorch's tutorial](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html). It introduces basic Julia programming, as well Zygote, a source-to-source automatic differentiation (AD) framework in Julia. We'll use these tools to build a very simple neural network. + +## Arrays + +The starting point for all of our models is the `Array` (sometimes referred to as a `Tensor` in other frameworks). This is really just a list of numbers, which might be arranged into a shape like a square. Let's write down an array with three elements. + +```julia +x = [1, 2, 3] +``` + +Here's a matrix – a square array with four elements. + +```julia +x = [1 2; 3 4] +``` + +We often work with arrays of thousands of elements, and don't usually write them down by hand. Here's how we can create an array of 5×3 = 15 elements, each a random number from zero to one. + +```julia +x = rand(5, 3) +``` + +There's a few functions like this; try replacing `rand` with `ones`, `zeros`, or `randn` to see what they do. + +By default, Julia works stores numbers is a high-precision format called `Float64`. In ML we often don't need all those digits, and can ask Julia to work with `Float32` instead. We can even ask for more digits using `BigFloat`. + +```julia +x = rand(BigFloat, 5, 3) + +x = rand(Float32, 5, 3) +``` + +We can ask the array how many elements it has. + +```julia +length(x) +``` + +Or, more specifically, what size it has. + +```julia +size(x) +``` + +We sometimes want to see some elements of the array on their own. + +```julia +x + +x[2, 3] +``` + +This means get the second row and the third column. We can also get every row of the third column. + +```julia +x[:, 3] +``` + +We can add arrays, and subtract them, which adds or subtracts each element of the array. + +```julia +x + x + +x - x +``` + +Julia supports a feature called *broadcasting*, using the `.` syntax. This tiles small arrays (or single numbers) to fill bigger ones. + +```julia +x .+ 1 +``` + +We can see Julia tile the column vector `1:5` across all rows of the larger array. + +```julia +zeros(5,5) .+ (1:5) +``` + +The x' syntax is used to transpose a column `1:5` into an equivalent row, and Julia will tile that across columns. + +```julia +zeros(5,5) .+ (1:5)' +``` + +We can use this to make a times table. + +```julia +(1:5) .* (1:5)' +``` + +Finally, and importantly for machine learning, we can conveniently do things like matrix multiply. + +```julia +W = randn(5, 10) +x = rand(10) +W * x +``` + +Julia's arrays are very powerful, and you can learn more about what they can do [here](https://docs.julialang.org/en/v1/manual/arrays/). + +### CUDA Arrays + +CUDA functionality is provided separately by the [CUDA package](https://github.com/JuliaGPU/CUDA.jl). If you have a GPU and CUDA available, you can run `] add CUDA` in a REPL or IJulia to get it. + +Once CUDA is loaded you can move any array to the GPU with the `cu` function, and it supports all of the above operations with the same syntax. + +```julia +using CUDA +x = cu(rand(5, 3)) +``` + +## Automatic Differentiation + +You probably learned to take derivatives in school. We start with a simple mathematical function like + +```julia +f(x) = 3x^2 + 2x + 1 + +f(5) +``` + +In simple cases it's pretty easy to work out the gradient by hand – here it's `6x+2`. But it's much easier to make Flux do the work for us! + +```julia +using Flux: gradient + +df(x) = gradient(f, x)[1] + +df(5) +``` + +You can try this with a few different inputs to make sure it's really the same as `6x+2`. We can even do this multiple times (but the second derivative is a fairly boring `6`). + +```julia +ddf(x) = gradient(df, x)[1] + +ddf(5) +``` + +Flux's AD can handle any Julia code you throw at it, including loops, recursion and custom layers, so long as the mathematical functions you call are differentiable. For example, we can differentiate a Taylor approximation to the `sin` function. + +```julia +mysin(x) = sum((-1)^k*x^(1+2k)/factorial(1+2k) for k in 0:5) + +x = 0.5 + +mysin(x), gradient(mysin, x) + +sin(x), cos(x) +``` + +You can see that the derivative we calculated is very close to `cos(x)`, as we expect. + +This gets more interesting when we consider functions that take *arrays* as inputs, rather than just a single number. For example, here's a function that takes a matrix and two vectors (the definition itself is arbitrary) + +```julia +myloss(W, b, x) = sum(W * x .+ b) + +W = randn(3, 5) +b = zeros(3) +x = rand(5) + +gradient(myloss, W, b, x) +``` + +Now we get gradients for each of the inputs `W`, `b` and `x`, which will come in handy when we want to train models. + +Because ML models can contain hundreds of parameters, Flux provides a slightly different way of writing `gradient`. We instead mark arrays with `param` to indicate that we want their derivatives. `W` and `b` represent the weight and bias respectively. + +```julia +using Flux: params + +W = randn(3, 5) +b = zeros(3) +x = rand(5) + +y(x) = sum(W * x .+ b) + +grads = gradient(()->y(x), params([W, b])) + +grads[W], grads[b] +``` + + +We can now grab the gradients of `W` and `b` directly from those parameters. + +This comes in handy when working with *layers*. A layer is just a handy container for some parameters. For example, `Dense` does a linear transform for you. + +```julia +using Flux + +m = Dense(10, 5) + +x = rand(Float32, 10) +``` + +We can easily get the parameters of any layer or model with params with `params`. + +```julia +params(m) +``` + +This makes it very easy to calculate the gradient for all parameters in a network, even if it has many parameters. + +```julia +x = rand(Float32, 10) +m = Chain(Dense(10, 5, relu), Dense(5, 2), softmax) +l(x) = sum(Flux.crossentropy(m(x), [0.5, 0.5])) +grads = gradient(params(m)) do + l(x) +end +for p in params(m) + println(grads[p]) +end +``` + +You don't have to use layers, but they can be convient for many simple kinds of models and fast iteration. + +The next step is to update our weights and perform optimisation. As you might be familiar, *Gradient Descent* is a simple algorithm that takes the weights and steps using a learning rate and the gradients. `weights = weights - learning_rate * gradient`. + +```julia +using Flux.Optimise: update!, Descent +η = 0.1 +for p in params(m) + update!(p, -η * grads[p]) +end +``` + +While this is a valid way of updating our weights, it can get more complicated as the algorithms we use get more involved. + +Flux comes with a bunch of pre-defined optimisers and makes writing our own really simple. We just give it the learning rate η: + +```julia +opt = Descent(0.01) +``` + +`Training` a network reduces down to iterating on a dataset mulitple times, performing these steps in order. Just for a quick implementation, let’s train a network that learns to predict `0.5` for every input of 10 floats. `Flux` defines the `train!` function to do it for us. + +```julia +data, labels = rand(10, 100), fill(0.5, 2, 100) +loss(x, y) = sum(Flux.crossentropy(m(x), y)) +Flux.train!(loss, params(m), [(data,labels)], opt) +``` + +You don't have to use `train!`. In cases where aribtrary logic might be better suited, you could open up this training loop like so: + +```julia + for d in training_set # assuming d looks like (data, labels) + # our super logic + gs = gradient(params(m)) do #m is our model + l = loss(d...) + end + update!(opt, params(m), gs) + end +``` + +## Training a Classifier + +Getting a real classifier to work might help cement the workflow a bit more. [CIFAR10](https://https://www.cs.toronto.edu/~kriz/cifar.html) is a dataset of 50k tiny training images split into 10 classes. + +We will do the following steps in order: + +* Load CIFAR10 training and test datasets +* Define a Convolution Neural Network +* Define a loss function +* Train the network on the training data +* Test the network on the test data + +### Loading the Dataset + +```julia +using Statistics +using Flux, Flux.Optimise +using MLDatasets: CIFAR10 +using Images.ImageCore +using Flux: onehotbatch, onecold +using Base.Iterators: partition +using CUDA +``` + +This image will give us an idea of what we are dealing with. + +![title](https://pytorch.org/tutorials/_images/cifar10.png) + +```julia +train_x, train_y = CIFAR10.traindata(Float32) +labels = onehotbatch(train_y, 0:9) +``` + +The `train_x` contains 50000 images converted to 32 X 32 X 3 arrays with the third dimension being the 3 channels (R,G,B). Let's take a look at a random image from the train_x. For this, we need to permute the dimensions to 3 X 32 X 32 and use `colorview` to convert it back to an image. + +```julia +using Plots +image(x) = colorview(RGB, permutedims(x, (3, 2, 1))) +plot(image(train_x[:,:,:,rand(1:end)])) +``` + +We can now arrange the training data in batches of say, 1000 and keep a validation set to track our progress. This process is called minibatch learning, which is a popular method of training large neural networks. Rather that sending the entire dataset at once, we break it down into smaller chunks (called minibatches) that are typically chosen at random, and train only on them. It is shown to help with escaping [saddle points](https://en.wikipedia.org/wiki/Saddle_point). + +The first 49k images (in batches of 1000) will be our training set, and the rest is for validation. `partition` handily breaks down the set we give it in consecutive parts (1000 in this case). + +```julia +train = ([(train_x[:,:,:,i], labels[:,i]) for i in partition(1:49000, 1000)]) |> gpu +valset = 49001:50000 +valX = train_x[:,:,:,valset] |> gpu +valY = labels[:, valset] |> gpu +``` + +### Defining the Classifier + +Now we can define our Convolutional Neural Network (CNN). + +A convolutional neural network is one which defines a kernel and slides it across a matrix to create an intermediate representation to extract features from. It creates higher order features as it goes into deeper layers, making it suitable for images, where the strucure of the subject is what will help us determine which class it belongs to. + +```julia +m = Chain( + Conv((5,5), 3=>16, relu), + MaxPool((2,2)), + Conv((5,5), 16=>8, relu), + MaxPool((2,2)), + x -> reshape(x, :, size(x, 4)), + Dense(200, 120), + Dense(120, 84), + Dense(84, 10), + softmax) |> gpu +``` + +We will use a crossentropy loss and an Momentum optimiser here. Crossentropy will be a good option when it comes to working with mulitple independent classes. Momentum gradually lowers the learning rate as we proceed with the training. It helps maintain a bit of adaptivity in our optimisation, preventing us from over shooting from our desired destination. + +```julia +using Flux: crossentropy, Momentum + +loss(x, y) = sum(crossentropy(m(x), y)) +opt = Momentum(0.01) +``` + +We can start writing our train loop where we will keep track of some basic accuracy numbers about our model. We can define an `accuracy` function for it like so. + +```julia +accuracy(x, y) = mean(onecold(m(x), 0:9) .== onecold(y, 0:9)) +``` + +### Training the Classifier + + +Training is where we do a bunch of the interesting operations we defined earlier, and see what our net is capable of. We will loop over the dataset 10 times and feed the inputs to the neural network and optimise. + +```julia +epochs = 10 + +for epoch = 1:epochs + for d in train + gs = gradient(params(m)) do + l = loss(d...) + end + update!(opt, params(m), gs) + end + @show accuracy(valX, valY) +end +``` + +Seeing our training routine unfold gives us an idea of how the network learnt the function. This is not bad for a small hand-written network, trained for a limited time. + +### Training on a GPU + +The `gpu` functions you see sprinkled through this bit of the code tell Flux to move these entities to an available GPU, and subsequently train on it. No extra faffing about required! The same bit of code would work on any hardware with some small annotations like you saw here. + +### Testing the Network + +We have trained the network for 100 passes over the training dataset. But we need to check if the network has learnt anything at all. + +We will check this by predicting the class label that the neural network outputs, and checking it against the ground-truth. If the prediction is correct, we add the sample to the list of correct predictions. This will be done on a yet unseen section of data. + +Okay, first step. Let us perform the exact same preprocessing on this set, as we did on our training set. + +```julia +test_x, test_y = CIFAR10.testdata(Float32) +test_labels = onehotbatch(test_y, 0:9) + +test = gpu.([(test_x[:,:,:,i], test_labels[:,i]) for i in partition(1:10000, 1000)]) +``` + +Next, display an image from the test set. + +```julia +plot(image(test_x[:,:,:,rand(1:end)])) +``` + +The outputs are energies for the 10 classes. Higher the energy for a class, the more the network thinks that the image is of the particular class. Every column corresponds to the output of one image, with the 10 floats in the column being the energies. + +Let's see how the model fared. + +```julia +ids = rand(1:10000, 5) +rand_test = test_x[:,:,:,ids] |> gpu +rand_truth = test_y[ids] +m(rand_test) +``` + +This looks similar to how we would expect the results to be. At this point, it's a good idea to see how our net actually performs on new data, that we have prepared. + +```julia +accuracy(test[1]...) +``` + +This is much better than random chance set at 10% (since we only have 10 classes), and not bad at all for a small hand written network like ours. + +Let's take a look at how the net performed on all the classes performed individually. + +```julia +class_correct = zeros(10) +class_total = zeros(10) +for i in 1:10 + preds = m(test[i][1]) + lab = test[i][2] + for j = 1:1000 + pred_class = findmax(preds[:, j])[2] + actual_class = findmax(lab[:, j])[2] + if pred_class == actual_class + class_correct[pred_class] += 1 + end + class_total[actual_class] += 1 + end +end + +class_correct ./ class_total +``` + +The spread seems pretty good, with certain classes performing significantly better than the others. Why should that be? + +!!! info + Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 15 November 2020. + Written by Saswat Das, Mike Innes, Andrew Dinhobl, Ygor Canalli, Sudhanshu Agrawal, João Felipe Santos. + diff --git a/docs/src/tutorials/2021-01-26-mlp.md b/docs/src/tutorials/2021-01-26-mlp.md new file mode 100644 index 0000000000..54831834c8 --- /dev/null +++ b/docs/src/tutorials/2021-01-26-mlp.md @@ -0,0 +1,169 @@ +# Tutorial: Simple Multi-layer Perceptron + +In this example, we create a simple [multi-layer perceptron](https://en.wikipedia.org/wiki/Multilayer_perceptron#:~:text=A%20multilayer%20perceptron%20(MLP)%20is,artificial%20neural%20network%20(ANN).&text=An%20MLP%20consists%20of%20at,uses%20a%20nonlinear%20activation%20function.) (MLP) that classifies handwritten digits using the MNIST dataset. A MLP consists of at least *three layers* of stacked perceptrons: Input, hidden, and output. Each neuron of an MLP has parameters (weights and bias) and uses an [activation function](https://en.wikipedia.org/wiki/Activation_function) to compute its output. + +To run this example, we need the following packages: + +```julia +using Flux, Statistics +using Flux.Data: DataLoader +using Flux: onehotbatch, onecold, logitcrossentropy, throttle, @epochs +using Base.Iterators: repeated +using Parameters: @with_kw +using CUDA +using MLDatasets +if has_cuda() # Check if CUDA is available + @info "CUDA is on" + CUDA.allowscalar(false) +end +``` + +We set default values for learning rate, batch size, epochs, and the usage of a GPU (if available) for our model: + +```julia +@with_kw mutable struct Args + η::Float64 = 3e-4 # learning rate + batchsize::Int = 1024 # batch size + epochs::Int = 10 # number of epochs + device::Function = gpu # set as gpu, if gpu available +end +``` + + +If a GPU is available on our local system, then Flux uses it for computing the loss and updating the weights and biases when training our model. + +## Data + +We create the function `getdata` to load the MNIST train and test data sets from [MLDatasets](https://juliaml.github.io/MLDatasets.jl/latest/) and prepare them for the training process. In addition, we set mini-batches of the data sets by loading them onto a [DataLoader](https://fluxml.ai/Flux.jl/stable/data/dataloader/#Flux.Data.DataLoader) object. + +```julia +function getdata(args) + ENV["DATADEPS_ALWAYS_ACCEPT"] = "true" + + # Loading Dataset + xtrain, ytrain = MLDatasets.MNIST.traindata(Float32) + xtest, ytest = MLDatasets.MNIST.testdata(Float32) + + # Reshape Data in order to flatten each image into a linear array + xtrain = Flux.flatten(xtrain) + xtest = Flux.flatten(xtest) + + # One-hot-encode the labels + ytrain, ytest = onehotbatch(ytrain, 0:9), onehotbatch(ytest, 0:9) + + # Batching + train_data = DataLoader((xtrain, ytrain), batchsize=args.batchsize, shuffle=true) + test_data = DataLoader((xtest, ytest), batchsize=args.batchsize) + + return train_data, test_data +end +``` + + +`getdata` performs the following steps: + +* **Loads MNIST data set:** Loads the train and test set tensors. The shape of train data is `28x28x60000` and test data is `28X28X10000`. +* **Reshapes the train and test data:** Uses the [flatten](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.flatten) function to reshape the train data set into a `784x60000` array and test data set into a `784x10000`. Notice that we reshape the data so that we can pass these as arguments for the input layer of our model (a simple MLP expects a vector as an input). +* **One-hot encodes the train and test labels:** Creates a batch of one-hot vectors so we can pass the labels of the data as arguments for the loss function. For this example, we use the [logitcrossentropy](https://fluxml.ai/Flux.jl/stable/models/losses/#Flux.Losses.logitcrossentropy) function and it expects data to be one-hot encoded. +* **Creates batches of data:** Creates two DataLoader objects (train and test) that handle data mini-batches of size `1024 ` (as defined above). We create these two objects so that we can pass the entire data set through the loss function at once when training our model. Also, it shuffles the data points during each iteration (`shuffle=true`). + +## Model + +As we mentioned above, a MLP consist of *three* layers that are fully connected. For this example, we define out model with the following layers and dimensions: + +* **Input:** It has `784` perceptrons (the MNIST image size is `28x28`). We flatten the train and test data so that we can pass them as arguments to this layer. +* **Hidden:** It has `32` perceptrons that use the [relu](https://fluxml.ai/Flux.jl/stable/models/nnlib/#NNlib.relu) activation function. +* **Output:** It has `10` perceptrons that output the model's prediction or probability that a digit is 0 to 9. + + +We define our model with the `build_model` function: + +```julia +function build_model(; imgsize=(28,28,1), nclasses=10) + return Chain( + Dense(prod(imgsize), 32, relu), + Dense(32, nclasses)) +end +``` + + +Note that we use the functions [Dense](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Dense) so that our model is *densely* (or fully) connected and [Chain](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Chain) to chain the computation of the three layers. + +## Loss functions + +Now, we define the loss function `loss_all`. It expects a DataLoader object and the `model` function we defined aboved as arguments. Notice that this function iterates through the `dataloader` object in mini-batches and uses the function [logitcrossentropy](https://fluxml.ai/Flux.jl/stable/models/losses/#Flux.Losses.logitcrossentropy) to compute the difference between the predicted and actual values. + +```julia +function loss_all(dataloader, model) + l = 0f0 + for (x,y) in dataloader + l += logitcrossentropy(model(x), y) + end + l/length(dataloader) +end +``` + + +In addition, we define the function (`accuracy`) to report the accuracy of our model during the training process. To compute the accuray, we need to decode the output of our model using the [onecold](https://fluxml.ai/Flux.jl/stable/data/onehot/#Flux.onecold) function. + +```julia +function accuracy(data_loader, model) + acc = 0 + for (x,y) in data_loader + acc += sum(onecold(cpu(model(x))) .== onecold(cpu(y)))*1 / size(x,2) + end + acc/length(data_loader) +end +``` + + +## Train our model + +Finally, we create the `train` function that calls the functions we defined and trains the model. + +```julia +function train(; kws...) + # Initializing Model parameters + args = Args(; kws...) + + # Load Data + train_data,test_data = getdata(args) + + # Construct model + m = build_model() + train_data = args.device.(train_data) + test_data = args.device.(test_data) + m = args.device(m) + loss(x,y) = logitcrossentropy(m(x), y) + + ## Training + evalcb = () -> @show(loss_all(train_data, m)) + opt = ADAM(args.η) + + @epochs args.epochs Flux.train!(loss, params(m), train_data, opt, cb = evalcb) + + @show accuracy(train_data, m) + + @show accuracy(test_data, m) +end +``` + + +`train` performs the following steps: + +* **Initializes the model parameters:** Creates the `args` object that contains the defult values for training our model. +* **Loads the train and test data:** Calls the function `getdata` we defined above. +* **Constructs the model:** Builds the model and loads the train and test data sets, and our model onto the GPU (if available). +* **Trains the model:** Defines the *callback* function `evalcb` to show the value of the `loss_all` function during the training process. Then, it sets [ADAM](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.ADAM) as the optimiser for training out model. Finally, it runs the training process with the macro `@epochs` for `10` epochs (as defined in the `args` object) and shows the `accuracy` value for the train and test data. + + +To see the full version of this example, see [Simple multi-layer perceptron - model-zoo](https://github.com/FluxML/model-zoo/blob/master/vision/mlp_mnist/mlp_mnist.jl). + +## Resources + +* [3Blue1Brown Neural networks videos](https://www.youtube.com/watch?v=aircAruvnKk&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi). +* [Neural Networks and Deep Learning](http://neuralnetworksanddeeplearning.com/). + +!!! info + Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 26 January 2021. + Written by Adarsh Kumar, Mike J Innes, Andrew Dinhobl, Jerry Ling, natema, Zhang Shitian, Liliana Badillo, Dhairya Gandhi diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md new file mode 100644 index 0000000000..ed9996ccec --- /dev/null +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -0,0 +1,260 @@ +# Tutorial: A Simple ConvNet + +In this tutorial, we build a simple Convolutional Neural Network (ConvNet) to classify the MNIST dataset. This model has a simple architecture with three feature detection layers (Conv -> ReLU -> MaxPool) followed by a final dense layer that classifies MNIST handwritten digits. Note that this model, while simple, should hit around 99% test accuracy after training for approximately 20 epochs. + +This example writes out the saved model to the file `mnist_conv.bson`. Also, it demonstrates basic model construction, training, saving, conditional early-exit, and learning rate scheduling. + +To run this example, we need the following packages: + +```julia +using Flux, MLDatasets, Statistics +using Flux: onehotbatch, onecold, logitcrossentropy +using MLDatasets: MNIST +using Base.Iterators: partition +using Printf, BSON +using Parameters: @with_kw +using CUDA +CUDA.allowscalar(false) +``` + +We set default values for learning rate, batch size, number of epochs, and path for saving the file `mnist_conv.bson`: + +```julia +@with_kw mutable struct Args + lr::Float64 = 3e-3 + epochs::Int = 20 + batch_size = 128 + savepath::String = "./" +end +``` + +To train our model, we need to bundle images together with their labels and group them into mini-batches (makes the training process faster). We define the function `make_minibatch` that takes as inputs the images (`X`) and their labels (`Y`) as well as the indices for the mini-batches (`idx`): + +```julia +function make_minibatch(X, Y, idxs) + X_batch = Array{Float32}(undef, size(X)[1:end-1]..., 1, length(idxs)) + for i in 1:length(idxs) + X_batch[:, :, :, i] = Float32.(X[:,:,idxs[i]]) + end + Y_batch = onehotbatch(Y[idxs], 0:9) + return (X_batch, Y_batch) +end +``` + +`make_minibatch` takes the following steps: + +* Creates the `X_batch` array of size `28x28x1x128` to store the mini-batches. +* Stores the mini-batches in `X_batch`. +* One hot encodes the labels of the images. +* Stores the labels in `Y_batch`. + + + + `get_processed_data` loads the train and test data from `Flux.Data.MNIST`. First, it loads the images and labels of the train data set, and creates an array that contains the indices of the train images that correspond to each mini-batch (of size `args.batch_size`). Then, it calls the `make_minibatch` function to create all of the train mini-batches. Finally, it loads the test images and creates one mini-batch that contains them all. + +```julia +function get_processed_data(args) + # Load labels and images + train_imgs, train_labels = MNIST.traindata() + mb_idxs = partition(1:length(train_labels), args.batch_size) + train_set = [make_minibatch(train_imgs, train_labels, i) for i in mb_idxs] + + # Prepare test set as one giant minibatch: + test_imgs, test_labels = MNIST.testdata() + test_set = make_minibatch(test_imgs, test_labels, 1:length(test_labels)) + + return train_set, test_set + +end +``` + + +Now, we define the `build_model` function that creates a ConvNet model which is composed of *three* convolution layers (feature detection) and *one* classification layer. The input layer size is `28x28`. The images are grayscale, which means there is only *one* channel (compared to 3 for RGB) in every data point. Combined together, the convolutional layer structure would look like `Conv(kernel, input_channels => output_channels, ...)`. Each convolution layer reduces the size of the image by applying the Rectified Linear unit (ReLU) and MaxPool operations. +On the other hand, the classification layer outputs a vector of 10 dimensions (a dense layer), that is, the number of classes that the model will be able to predict. + + +```julia +function build_model(args; imgsize = (28,28,1), nclasses = 10) + cnn_output_size = Int.(floor.([imgsize[1]/8,imgsize[2]/8,32])) + + return Chain( + # First convolution, operating upon a 28x28 image + Conv((3, 3), imgsize[3]=>16, pad=(1,1), relu), + MaxPool((2,2)), + + # Second convolution, operating upon a 14x14 image + Conv((3, 3), 16=>32, pad=(1,1), relu), + MaxPool((2,2)), + + # Third convolution, operating upon a 7x7 image + Conv((3, 3), 32=>32, pad=(1,1), relu), + MaxPool((2,2)), + + # Reshape 3d array into a 2d one using `Flux.flatten`, at this point it should be (3, 3, 32, N) + flatten, + Dense(prod(cnn_output_size), 10)) +end +``` + +To chain the layers of a model we use the Flux function [Chain](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Chain). It enables us to call the layers in sequence on a given input. Also, we use the function [flatten](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.flatten) to reshape the output image from the last convolution layer. Finally, we call the [Dense](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Dense) function to create the classification layer. + + +Before training our model, we need to define a few functions that will be helpful for the process: + + +* `augment` augments the data by adding gaussian random noise to our image to make it more robust: + + ```julia + augment(x) = x .+ gpu(0.1f0*randn(eltype(x), size(x))) + ``` + + +* `anynan` checks whether any element of the params is NaN or not: + + ```julia + anynan(x) = any(y -> any(isnan, y), x) + ``` + +* `accuracy` computes the accuracy of our ConvNet: + + ```julia + accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) + ``` + +Finally, we define the `train` function: + +```julia +function train(; kws...) + args = Args(; kws...) + + @info("Loading data set") + train_set, test_set = get_processed_data(args) + + # Define our model. We will use a simple convolutional architecture with + # three iterations of Conv -> ReLU -> MaxPool, followed by a final Dense layer. + @info("Building model...") + model = build_model(args) + + # Load model and datasets onto GPU, if enabled + train_set = gpu.(train_set) + test_set = gpu.(test_set) + model = gpu(model) + + # Make sure our model is nicely precompiled before starting our training loop + model(train_set[1][1]) + + # `loss()` calculates the crossentropy loss between our prediction `y_hat` + # (calculated from `model(x)`) and the ground truth `y`. We augment the data + # a bit, adding gaussian random noise to our image to make it more robust. + function loss(x, y) + x̂ = augment(x) + ŷ = model(x̂) + return logitcrossentropy(ŷ, y) + end + + # Train our model with the given training set using the ADAM optimizer and + # printing out performance against the test set as we go. + opt = ADAM(args.lr) + + @info("Beginning training loop...") + best_acc = 0.0 + last_improvement = 0 + for epoch_idx in 1:args.epochs + # Train for a single epoch + Flux.train!(loss, params(model), train_set, opt) + + # Terminate on NaN + if anynan(Flux.params(model)) + @error "NaN params" + break + end + + # Calculate accuracy: + acc = accuracy(test_set..., model) + + @info(@sprintf("[%d]: Test accuracy: %.4f", epoch_idx, acc)) + # If our accuracy is good enough, quit out. + if acc >= 0.999 + @info(" -> Early-exiting: We reached our target accuracy of 99.9%") + break + end + + # If this is the best accuracy we've seen so far, save the model out + if acc >= best_acc + @info(" -> New best accuracy! Saving model out to mnist_conv.bson") + BSON.@save joinpath(args.savepath, "mnist_conv.bson") params=cpu.(params(model)) epoch_idx acc + best_acc = acc + last_improvement = epoch_idx + end + + # If we haven't seen improvement in 5 epochs, drop our learning rate: + if epoch_idx - last_improvement >= 5 && opt.eta > 1e-6 + opt.eta /= 10.0 + @warn(" -> Haven't improved in a while, dropping learning rate to $(opt.eta)!") + + # After dropping learning rate, give it a few epochs to improve + last_improvement = epoch_idx + end + + if epoch_idx - last_improvement >= 10 + @warn(" -> We're calling this converged.") + break + end + end +end +``` + +`train` calls the functions we defined above and trains our model. It stops when the model achieves 99% accuracy (early-exiting) or after performing 20 steps. More specifically, it performs the following steps: + + * Loads the MNIST dataset. + * Builds our ConvNet model (as described above). + * Loads the train and test data sets as well as our model onto a GPU (if available). + * Defines a `loss` function that calculates the crossentropy between our prediction and the ground truth. + * Sets the [ADAM optimiser](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.ADAM) to train the model with learning rate `args.lr`. + * Runs the training loop. For each step (or epoch), it executes the following: + * Calls `Flux.train!` function to execute one training step. + * If any of the parameters of our model is `NaN`, then the training process is terminated. + * Calculates the model accuracy. + * If the model accuracy is >= 0.999, then early-exiting is executed. + * If the actual accuracy is the best so far, then the model is saved to `mnist_conv.bson`. Also, the new best accuracy and the current epoch is saved. + * If there has not been any improvement for the last 5 epochs, then the learning rate is dropped and the process waits a little longer for the accuracy to improve. + * If the last improvement was more than 10 epochs ago, then the process is terminated. + + +Finally, to test our model we define the `test` function: + +```julia +function test(; kws...) + args = Args(; kws...) + + # Loading the test data + _,test_set = get_processed_data(args) + + # Re-constructing the model with random initial weights + model = build_model(args) + + # Loading the saved parameters + BSON.@load joinpath(args.savepath, "mnist_conv.bson") params + + # Loading parameters onto the model + Flux.loadparams!(model, params) + + test_set = gpu.(test_set) + model = gpu(model) + @show accuracy(test_set...,model) +end +``` + +`test` loads the MNIST test data set, reconstructs the model, and loads the saved parameters (in `mnist_conv.bson`) onto it. Finally, it computes our model's predictions for the test set and shows the test accuracy (around 99%). + +To see the full version of this example, see [Simple ConvNets - model-zoo](https://github.com/FluxML/model-zoo/blob/master/vision/conv_mnist/conv_mnist.jl). + +## Resources + +* [Neural Networks in Flux.jl with Huda Nassar (working with the MNIST dataset)](https://youtu.be/Oxi0Pfmskus) +* [Convolutional Neural Networks (CNNs / ConvNets)](https://cs231n.github.io/convolutional-networks/). +* [Convolutional Neural Networks Tutorial in PyTorch](https://adventuresinmachinelearning.com/convolutional-neural-networks-tutorial-in-pytorch/). + +!!! info + Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 7 February 2021. + Written by Elliot Saba, Adarsh Kumar, Mike J Innes, Dhairya Gandhi, Sudhanshu Agrawal, Sambit Kumar Dash, fps.io, Carlo Lucibello, Andrew Dinhobl, Liliana Badillo diff --git a/docs/src/tutorials/2021-10-08-dcgan-mnist.md b/docs/src/tutorials/2021-10-08-dcgan-mnist.md new file mode 100644 index 0000000000..31b1ebb914 --- /dev/null +++ b/docs/src/tutorials/2021-10-08-dcgan-mnist.md @@ -0,0 +1,363 @@ +# Tutorial: Deep Convolutional Generative Adversarial Network (DCGAN) + +This is a beginner level tutorial for generating images of handwritten digits using a [Deep Convolutional Generative Adversarial Network](https://arxiv.org/pdf/1511.06434.pdf) inspired by the [TensorFlow tutorial on DCGAN](https://www.tensorflow.org/tutorials/generative/dcgan). + +## What are GANs? +[Generative Adversarial Neural Networks or simply GANs](https://arxiv.org/abs/1406.2661) introduced by Goodfellow et al. is one of the most innovative ideas in modern-day machine learning. GANs are used extensively in the field of image and audio processing to generate high-quality synthetic data that can easily be passed off as real data. + +A GAN is composed of two sub-models - the **generator** and the **discriminator** acting against one another. The generator can be considered as an artist who draws (generates) new images that look real, whereas the discriminator is a critic who learns to tell real images apart from fakes. + +![](../../assets/tutorialposts/2021-10-8-dcgan-mnist/cat_gan.png) + +The GAN starts with a generator and discriminator which have very little or no idea about the underlying data. During training, the generator progressively becomes better at creating images that look real, while the discriminator becomes better at telling them apart. The process reaches equilibrium when the discriminator can no longer distinguish real images from fakes. + + +![](https://www.tensorflow.org/tutorials/generative/images/gan2.png) + +[[source]](https://www.tensorflow.org/tutorials/generative/dcgan) + +This tutorial demonstrates the process of training a DC-GAN on the [MNIST dataset for handwritten digits](http://yann.lecun.com/exdb/mnist/). The following animation shows a series of images produced by the generator as it was trained for 25 epochs. The images begin as random noise, but over time, the images become increasingly similar to handwritten numbers. + +~~~ +

+

+ +

+~~~ + +## Setup + +We need to install some Julia packages before we start with our implementation of DCGAN. + +```julia +using Pkg + +# Activate a new project environment in the current directory +Pkg.activate(".") +# Add the required packages to the environment +Pkg.add(["Images", "Flux", "MLDatasets", "CUDA", "Parameters"]) +``` +*Note: Depending on your internet speed, it may take a few minutes for the packages install.* + + +After installing the libraries, load the required packages and functions: +```julia +using Base.Iterators: partition +using Printf +using Statistics +using Random +using Images +using Parameters: @with_kw +using Flux +using Flux.Data: DataLoader +using Flux.Optimise: update! +using Flux.Losses: logitbinarycrossentropy +using MLDatasets: MNIST +using CUDA +``` + +Now we set default values for the learning rates, batch size, epochs, the usage of a GPU (if available) and other hyperparameters for our model. + +```julia +@with_kw struct HyperParams + batch_size::Int = 128 + latent_dim::Int = 100 + epochs::Int = 25 + verbose_freq::Int = 1000 + output_dim::Int = 5 + disc_lr::Float64 = 0.0002 + gen_lr::Float64 = 0.0002 + device::Function = gpu +end +``` + +## Loading the data +As mentioned before, we will be using the MNIST dataset for handwritten digits. So we begin with a simple function for loading and pre-processing the MNIST images: +```julia +function load_MNIST_images(hparams) + images = MNIST.traintensor(Float32) + + # Normalize the images to (-1, 1) + normalized_images = @. 2f0 * images - 1f0 + image_tensor = reshape(normalized_images, 28, 28, 1, :) + + # Create a dataloader that iterates over mini-batches of the image tensor + dataloader = DataLoader(image_tensor, batchsize=hparams.batch_size, shuffle=true) + + return dataloader +end +``` +To learn more about loading images in Flux, you can check out [this tutorial](https://fluxml.ai/tutorials/2021/01/21/data-loader.html). + +*Note: The data returned from the dataloader is loaded is on the CPU. To train on the GPU, we need to transfer the data to the GPU beforehand.* + +## Create the models + + +### The generator + +Our generator, a.k.a. the artist, is a neural network that maps low dimensional data to a high dimensional form. + +- This low dimensional data (seed) is generally a vector of random values sampled from a normal distribution. +- The high dimensional data is the generated image. + +The `Dense` layer is used for taking the seed as an input which is upsampled several times using the [ConvTranspose](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.ConvTranspose) layer until we reach the desired output size (in our case, 28x28x1). Furthermore, after each `ConvTranspose` layer, we apply the Batch Normalization to stabilize the learning process. + +We will be using the [relu](https://fluxml.ai/Flux.jl/stable/models/nnlib/#NNlib.relu) activation function for each layer except the output layer, where we use `tanh` activation. + +We will also apply the weight initialization method mentioned in the original DCGAN paper. + +```julia +# Function for intializing the model weights with values +# sampled from a Gaussian distribution with μ=0 and σ=0.02 +dcgan_init(shape...) = randn(Float32, shape) * 0.02f0 +``` + +```julia +function Generator(latent_dim) + Chain( + Dense(latent_dim, 7*7*256, bias=false), + BatchNorm(7*7*256, relu), + + x -> reshape(x, 7, 7, 256, :), + + ConvTranspose((5, 5), 256 => 128; stride = 1, pad = 2, init = dcgan_init, bias=false), + BatchNorm(128, relu), + + ConvTranspose((4, 4), 128 => 64; stride = 2, pad = 1, init = dcgan_init, bias=false), + BatchNorm(64, relu), + + # The tanh activation ensures that output is in range of (-1, 1) + ConvTranspose((4, 4), 64 => 1, tanh; stride = 2, pad = 1, init = dcgan_init, bias=false), + ) +end +``` + +Time for a small test!! We create a dummy generator and feed a random vector as a seed to the generator. If our generator is initialized correctly it will return an array of size (28, 28, 1, `batch_size`). The `@assert` macro in Julia will raise an exception for the wrong output size. + +```julia +# Create a dummy generator of latent dim 100 +generator = Generator(100) +noise = randn(Float32, 100, 3) # The last axis is the batch size + +# Feed the random noise to the generator +gen_image = generator(noise) +@assert size(gen_image) == (28, 28, 1, 3) +``` + +Our generator model is yet to learn the correct weights, so it does not produce a recognizable image for now. To train our poor generator we need its equal rival, the *discriminator*. + +### Discriminator + +The Discriminator is a simple CNN based image classifier. The `Conv` layer a is used with a [leakyrelu](https://fluxml.ai/Flux.jl/stable/models/nnlib/#NNlib.leakyrelu) activation function. + +```julia +function Discriminator() + Chain( + Conv((4, 4), 1 => 64; stride = 2, pad = 1, init = dcgan_init), + x->leakyrelu.(x, 0.2f0), + Dropout(0.3), + + Conv((4, 4), 64 => 128; stride = 2, pad = 1, init = dcgan_init), + x->leakyrelu.(x, 0.2f0), + Dropout(0.3), + + # The output is now of the shape (7, 7, 128, batch_size) + flatten, + Dense(7 * 7 * 128, 1) + ) +end +``` +For a more detailed implementation of a CNN-based image classifier, you can refer to [this tutorial](https://fluxml.ai/tutorials/2021/02/07/convnet.html). + +Now let us check if our discriminator is working: + +```julia +# Dummy Discriminator +discriminator = Discriminator() +# We pass the generated image to the discriminator +logits = discriminator(gen_image) +@assert size(logits) == (1, 3) +``` + +Just like our dummy generator, the untrained discriminator has no idea about what is a real or fake image. It needs to be trained alongside the generator to output positive values for real images, and negative values for fake images. + +## Loss functions for GAN + +In a GAN problem, there are only two labels involved: fake and real. So Binary CrossEntropy is an easy choice for a preliminary loss function. + +But even if Flux's `binarycrossentropy` does the job for us, due to numerical stability it is always preferred to compute cross-entropy using logits. Flux provides [logitbinarycrossentropy](https://fluxml.ai/Flux.jl/stable/models/losses/#Flux.Losses.logitbinarycrossentropy) specifically for this purpose. Mathematically it is equivalent to `binarycrossentropy(σ(ŷ), y, kwargs...).` + +### Discriminator Loss + +The discriminator loss quantifies how well the discriminator can distinguish real images from fakes. It compares + +- discriminator's predictions on real images to an array of 1s, and +- discriminator's predictions on fake (generated) images to an array of 0s. + +These two losses are summed together to give a scalar loss. So we can write the loss function of the discriminator as: + +```julia +function discriminator_loss(real_output, fake_output) + real_loss = logitbinarycrossentropy(real_output, 1) + fake_loss = logitbinarycrossentropy(fake_output, 0) + return real_loss + fake_loss +end +``` + +### Generator Loss + +The generator's loss quantifies how well it was able to trick the discriminator. Intuitively, if the generator is performing well, the discriminator will classify the fake images as real (or 1). + +```julia +generator_loss(fake_output) = logitbinarycrossentropy(fake_output, 1) +``` + +We also need optimizers for our network. Why you may ask? Read more [here](https://towardsdatascience.com/overview-of-various-optimizers-in-neural-networks-17c1be2df6d5). For both the generator and discriminator, we will use the [ADAM optimizer](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.ADAM). + +## Utility functions + +The output of the generator ranges from (-1, 1), so it needs to be de-normalized before we can display it as an image. To make things a bit easier, we define a function to visualize the output of the generator as a grid of images. + +```julia +function create_output_image(gen, fixed_noise, hparams) + fake_images = cpu(gen.(fixed_noise)) + image_array = reduce(vcat, reduce.(hcat, partition(fake_images, hparams.output_dim))) + image_array = permutedims(dropdims(image_array; dims=(3, 4)), (2, 1)) + image_array = @. Gray(image_array + 1f0) / 2f0 + return image_array +end +``` + +## Training + +For the sake of simplifying our training problem, we will divide the generator and discriminator training into two separate functions. + +```julia +function train_discriminator!(gen, disc, real_img, fake_img, opt, ps, hparams) + + disc_loss, grads = Flux.withgradient(ps) do + discriminator_loss(disc(real_img), disc(fake_img)) + end + + # Update the discriminator parameters + update!(opt, ps, grads) + return disc_loss +end +``` + +We define a similar function for the generator. + +```julia +function train_generator!(gen, disc, fake_img, opt, ps, hparams) + + gen_loss, grads = Flux.withgradient(ps) do + generator_loss(disc(fake_img)) + end + + update!(opt, ps, grads) + return gen_loss +end +``` + +Now that we have defined every function we need, we integrate everything into a single `train` function where we first set up all the models and optimizers and then train the GAN for a specified number of epochs. + +```julia +function train(hparams) + + dev = hparams.device + # Check if CUDA is actually present + if hparams.device == gpu + if !CUDA.has_cuda() + dev = cpu + @warn "No gpu found, falling back to CPU" + end + end + + # Load the normalized MNIST images + dataloader = load_MNIST_images(hparams) + + # Initialize the models and pass them to correct device + disc = Discriminator() |> dev + gen = Generator(hparams.latent_dim) |> dev + + # Collect the generator and discriminator parameters + disc_ps = params(disc) + gen_ps = params(gen) + + # Initialize the ADAM optimizers for both the sub-models + # with respective learning rates + disc_opt = ADAM(hparams.disc_lr) + gen_opt = ADAM(hparams.gen_lr) + + # Create a batch of fixed noise for visualizing the training of generator over time + fixed_noise = [randn(Float32, hparams.latent_dim, 1) |> dev for _=1:hparams.output_dim^2] + + # Training loop + train_steps = 0 + for ep in 1:hparams.epochs + @info "Epoch $ep" + for real_img in dataloader + + # Transfer the data to the GPU + real_img = real_img |> dev + + # Create a random noise + noise = randn!(similar(real_img, (hparams.latent_dim, hparams.batch_size))) + # Pass the noise to the generator to create a fake imagae + fake_img = gen(noise) + + # Update discriminator and generator + loss_disc = train_discriminator!(gen, disc, real_img, fake_img, disc_opt, disc_ps, hparams) + loss_gen = train_generator!(gen, disc, fake_img, gen_opt, gen_ps, hparams) + + if train_steps % hparams.verbose_freq == 0 + @info("Train step $(train_steps), Discriminator loss = $(loss_disc), Generator loss = $(loss_gen)") + # Save generated fake image + output_image = create_output_image(gen, fixed_noise, hparams) + save(@sprintf("output/dcgan_steps_%06d.png", train_steps), output_image) + end + train_steps += 1 + end + end + + output_image = create_output_image(gen, fixed_noise, hparams) + save(@sprintf("output/dcgan_steps_%06d.png", train_steps), output_image) + + return nothing +end +``` + +Now we finally get to train the GAN: + +```julia +# Define the hyper-parameters (here, we go with the default ones) +hparams = HyperParams() +train(hparams) +``` + +## Output +The generated images are stored inside the `output` folder. To visualize the output of the generator over time, we create a gif of the generated images. + +```julia +folder = "output" +# Get the image filenames from the folder +img_paths = readdir(folder, join=true) +# Load all the images as an array +images = load.(img_paths) +# Join all the images in the array to create a matrix of images +gif_mat = cat(images..., dims=3) +save("./output.gif", gif_mat) +``` + +

+ +

+ +## Resources & References +- [The DCGAN implementation in Model Zoo.](http=s://github.com/FluxML/model-zoo/blob/master/vision/dcgan_mnist/dcgan_mnist.jl) + +!!! info + Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 8 October 2021, + by Deeptendu Santra + diff --git a/docs/src/tutorials/2021-10-14-vanilla-gan.md b/docs/src/tutorials/2021-10-14-vanilla-gan.md new file mode 100644 index 0000000000..2647504a84 --- /dev/null +++ b/docs/src/tutorials/2021-10-14-vanilla-gan.md @@ -0,0 +1,280 @@ +# Tutorial: Generative Adversarial Networks + +This tutorial describes how to implement a vanilla Generative Adversarial +Network using Flux and how train it on the MNIST dataset. It is based on this +[Pytorch tutorial](https://medium.com/ai-society/gans-from-scratch-1-a-deep-introduction-with-code-in-pytorch-and-tensorflow-cb03cdcdba0f). The original GAN [paper](https://arxiv.org/abs/1406.2661) by Goodfellow et al. is a great resource that describes the motivation and theory behind GANs: + +> In the proposed adversarial nets framework, the generative model is pitted against an adversary: a +> discriminative model that learns to determine whether a sample is from the model distribution or the +> data distribution. The generative model can be thought of as analogous to a team of counterfeiters, +> trying to produce fake currency and use it without detection, while the discriminative model is +> analogous to the police, trying to detect the counterfeit currency. Competition in this game drives +> both teams to improve their methods until the counterfeits are indistinguishable from the genuine +> articles. + +Let's implement a GAN in Flux. To get started we first import a few useful packages: + + +```julia +using MLDatasets: MNIST +using Flux.Data: DataLoader +using Flux +using CUDA +using Zygote +using UnicodePlots +``` + +To download a package in the Julia REPL, type `]` to enter package mode and then +type `add MLDatasets` or perform this operation with the Pkg module like this + +```julia +> import Pkg +> Pkg.add(MLDatasets) +``` + +While [UnicodePlots]() is not necessary, it can be used to plot generated samples +into the terminal during training. Having direct feedback, instead of looking +at plots in a separate window, use fantastic for debugging. + + +Next, let us define values for learning rate, batch size, epochs, and other +hyper-parameters. While we are at it, we also define optimizers for the generator +and discriminator network. More on what these are later. + +```julia + lr_g = 2e-4 # Learning rate of the generator network + lr_d = 2e-4 # Learning rate of the discriminator network + batch_size = 128 # batch size + num_epochs = 1000 # Number of epochs to train for + output_period = 100 # Period length for plots of generator samples + n_features = 28 * 28# Number of pixels in each sample of the MNIST dataset + latent_dim = 100 # Dimension of latent space + opt_dscr = ADAM(lr_d)# Optimizer for the discriminator + opt_gen = ADAM(lr_g) # Optimizer for the generator +``` + + +In this tutorial I'm assuming that a CUDA-enabled GPU is available on the +system where the script is running. If this is not the case, simply remove +the `|>gpu` decorators: [piping](https://docs.julialang.org/en/v1/manual/functions/#Function-composition-and-piping). + +## Data loading +The MNIST data set is available from [MLDatasets](https://juliaml.github.io/MLDatasets.jl/latest/). The first time you instantiate it you will be prompted +if you want to download it. You should agree to this. + +GANs can be trained unsupervised. Therefore only keep the images from the training +set and discard the labels. + +After we load the training data we re-scale the data from values in [0:1] +to values in [-1:1]. GANs are notoriously tricky to train and this re-scaling +is a recommended [GAN hack](https://github.com/soumith/ganhacks). The +re-scaled data is used to define a data loader which handles batching +and shuffling the data. + +```julia + # Load the dataset + train_x, _ = MNIST.traindata(Float32); + # This dataset has pixel values ∈ [0:1]. Map these to [-1:1] + train_x = 2f0 * reshape(train_x, 28, 28, 1, :) .- 1f0 |>gpu; + # DataLoader allows to access data batch-wise and handles shuffling. + train_loader = DataLoader(train_x, batchsize=batch_size, shuffle=true); +``` + + +## Defining the Networks + + +A vanilla GAN, the discriminator and the generator are both plain, [feed-forward +multilayer perceptrons](https://boostedml.com/2020/04/feedforward-neural-networks-and-multilayer-perceptrons.html). We use leaky rectified linear units [leakyrelu](https://fluxml.ai/Flux.jl/stable/models/nnlib/#NNlib.leakyrelu) to ensure out model is non-linear. + +Here, the coefficient `α` (in the `leakyrelu` below), is set to 0.2. Empirically, +this value allows for good training of the network (based on prior experiments). +It has also been found that Dropout ensures a good generalization of the learned +network, so we will use that below. Dropout is usually active when training a +model and inactive in inference. Flux automatically sets the training mode when +calling the model in a gradient context. As a final non-linearity, we use the +`sigmoid` activation function. + +```julia +discriminator = Chain(Dense(n_features, 1024, x -> leakyrelu(x, 0.2f0)), + Dropout(0.3), + Dense(1024, 512, x -> leakyrelu(x, 0.2f0)), + Dropout(0.3), + Dense(512, 256, x -> leakyrelu(x, 0.2f0)), + Dropout(0.3), + Dense(256, 1, sigmoid)) |> gpu +``` + +Let's define the generator in a similar fashion. This network maps a latent +variable (a variable that is not directly observed but instead inferred) to the +image space and we set the input and output dimension accordingly. A `tanh` squashes +the output of the final layer to values in [-1:1], the same range that we squashed +the training data onto. + +```julia +generator = Chain(Dense(latent_dim, 256, x -> leakyrelu(x, 0.2f0)), + Dense(256, 512, x -> leakyrelu(x, 0.2f0)), + Dense(512, 1024, x -> leakyrelu(x, 0.2f0)), + Dense(1024, n_features, tanh)) |> gpu +``` + + + +## Training functions for the networks + +To train the discriminator, we present it with real data from the MNIST +data set and with fake data and reward it by predicting the correct labels for +each sample. The correct labels are of course 1 for in-distribution data +and 0 for out-of-distribution data coming from the generator. +[Binary cross entropy](https://fluxml.ai/Flux.jl/stable/models/losses/#Flux.Losses.binarycrossentropy) +is the loss function of choice. While the Flux documentation suggests to use +[Logit binary cross entropy](https://fluxml.ai/Flux.jl/stable/models/losses/#Flux.Losses.logitcrossentropy), +the GAN seems to be difficult to train with this loss function. +This function returns the discriminator loss for logging purposes. We can +calculate the loss in the same call as evaluating the pullback and resort +to getting the pullback directly from Zygote instead of calling +`Flux.train!` on the model. To calculate the gradients of the loss +function with respect to the parameters of the discriminator we then only have to +evaluate the pullback with a seed gradient of 1.0. These gradients are used +to update the model parameters + + +```julia +function train_dscr!(discriminator, real_data, fake_data) + this_batch = size(real_data)[end] # Number of samples in the batch + # Concatenate real and fake data into one big vector + all_data = hcat(real_data, fake_data) + + # Target vector for predictions: 1 for real data, 0 for fake data. + all_target = [ones(eltype(real_data), 1, this_batch) zeros(eltype(fake_data), 1, this_batch)] |> gpu; + + ps = Flux.params(discriminator) + loss, pullback = Zygote.pullback(ps) do + preds = discriminator(all_data) + loss = Flux.Losses.binarycrossentropy(preds, all_target) + end + # To get the gradients we evaluate the pullback with 1.0 as a seed gradient. + grads = pullback(1f0) + + # Update the parameters of the discriminator with the gradients we calculated above + Flux.update!(opt_dscr, Flux.params(discriminator), grads) + + return loss +end +``` + + +Now we need to define a function to train the generator network. The job of the +generator is to fool the discriminator so we reward the generator when the discriminator +predicts a high probability for its samples to be real data. In the training function +we first need to sample some noise, i.e. normally distributed data. This has +to be done outside the pullback since we don't want to get the gradients with +respect to the noise, but to the generator parameters. Inside the pullback we need +to first apply the generator to the noise since we will take the gradient with respect +to the parameters of the generator. We also need to call the discriminator in order +to evaluate the loss function inside the pullback. Here we need to remember to deactivate +the dropout layers of the discriminator. We do this by setting the discriminator into +test mode before the pullback. Immediately after the pullback we set it back into training +mode. Then we evaluate the pullback, call it with a seed gradient of 1.0 as above, update the +parameters of the generator network and return the loss. + + +```julia +function train_gen!(discriminator, generator) + # Sample noise + noise = randn(latent_dim, batch_size) |> gpu; + + # Define parameters and get the pullback + ps = Flux.params(generator) + # Set discriminator into test mode to disable dropout layers + testmode!(discriminator) + # Evaluate the loss function while calculating the pullback. We get the loss for free + loss, back = Zygote.pullback(ps) do + preds = discriminator(generator(noise)); + loss = Flux.Losses.binarycrossentropy(preds, 1.) + end + # Evaluate the pullback with a seed-gradient of 1.0 to get the gradients for + # the parameters of the generator + grads = back(1.0f0) + Flux.update!(opt_gen, Flux.params(generator), grads) + # Set discriminator back into automatic mode + trainmode!(discriminator, mode=:auto) + return loss +end +``` + +## Training +Now we are ready to train the GAN. In the training loop we keep track +of the per-sample loss of the generator and the discriminator, where +we use the batch loss returned by the two training functions defined above. +In each epoch we iterate over the mini-batches given by the data loader. +Only minimal data processing needs to be done before the training functions +can be called. + +```julia +lossvec_gen = zeros(num_epochs) +lossvec_dscr = zeros(num_epochs) + +for n in 1:num_epochs + loss_sum_gen = 0.0f0 + loss_sum_dscr = 0.0f0 + + for x in train_loader + # - Flatten the images from 28x28xbatchsize to 784xbatchsize + real_data = flatten(x); + + # Train the discriminator + noise = randn(latent_dim, size(x)[end]) |> gpu + fake_data = generator(noise) + loss_dscr = train_dscr!(discriminator, real_data, fake_data) + loss_sum_dscr += loss_dscr + + # Train the generator + loss_gen = train_gen!(discriminator, generator) + loss_sum_gen += loss_gen + end + + # Add the per-sample loss of the generator and discriminator + lossvec_gen[n] = loss_sum_gen / size(train_x)[end] + lossvec_dscr[n] = loss_sum_dscr / size(train_x)[end] + + if n % output_period == 0 + @show n + noise = randn(latent_dim, 4) |> gpu; + fake_data = reshape(generator(noise), 28, 4*28); + p = heatmap(fake_data, colormap=:inferno) + print(p) + end +end +``` + +For the hyper-parameters shown in this example, the generator produces useful +images after about 1000 epochs. And after about 5000 epochs the result look +indistinguishable from real MNIST data. Using a Nvidia V100 GPU on a 2.7 +GHz Power9 CPU with 32 hardware threads, training 100 epochs takes about 80 +seconds when using the GPU. The GPU utilization is between 30 and 40%. +To observe the network more frequently during training you can for example set +`output_period=20`. Training the GAN using the CPU takes about 10 minutes +per epoch and is not recommended. + +## Results + +Below you can see what some of the images output may look like after different numbers of epochs. + +![](https://user-images.githubusercontent.com/35577566/138465727-3729b867-2c2c-4f12-ba8e-e7b00c73d82c.png) + +![](https://user-images.githubusercontent.com/35577566/138465750-423f70fc-c8e7-489c-8cf4-f01b203a24dd.png) + +![](https://user-images.githubusercontent.com/35577566/138465777-5c8252ae-e43b-4708-a42a-b0b85324f79d.png) + +![](https://user-images.githubusercontent.com/35577566/138465803-07239e62-9e68-42b7-9bb7-57fdff748ba9.png) + +## Resources + +* [A collection of GANs in Flux](https://github.com/AdarshKumar712/FluxGAN) +* [Wikipedia](https://en.wikipedia.org/wiki/Generative_adversarial_network) +* [GAN hacks](https://github.com/soumith/ganhacks) + +!!! info + Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 14 October 2021, + by Ralph Kube. diff --git a/docs/src/tutorials/linear_regression.md b/docs/src/tutorials/linear_regression.md index d73c20cc38..993c66e494 100644 --- a/docs/src/tutorials/linear_regression.md +++ b/docs/src/tutorials/linear_regression.md @@ -1,4 +1,4 @@ -# [Linear Regression](@id man-linear-regression) +# [Tutorial: Linear Regression](@id man-linear-regression) Flux is a pure Julia ML stack that allows you to build predictive models. Here are the steps for a typical Flux program: @@ -388,3 +388,7 @@ Summarising this tutorial, we started by generating a random yet correlated data Next, we trained the model by manually writing down the Gradient Descent algorithm and optimising the loss. We also saw how `Flux` provides various wrapper functionalities and keeps the API extremely intuitive and simple for the users. After getting familiar with the basics of `Flux` and `Julia`, we moved ahead to build a machine learning model for a real dataset. We repeated the exact same steps, but this time with a lot more features and data points, and by harnessing `Flux`'s full capabilities. In the end, we developed a training loop that was smarter than the hardcoded one and ran the model on our normalised dataset to conclude the tutorial. + +!!! info + Originally published on 21 November 2022, + by Saransh Chopra. From 3601ac2554dccd4e210f38316e01b194a4328478 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 24 Nov 2022 19:52:37 -0500 Subject: [PATCH 02/11] more heading links --- docs/src/tutorials/2020-09-15-deep-learning-flux.md | 2 +- docs/src/tutorials/2021-01-26-mlp.md | 2 +- docs/src/tutorials/2021-02-07-convnet.md | 2 +- docs/src/tutorials/2021-10-08-dcgan-mnist.md | 2 +- docs/src/tutorials/2021-10-14-vanilla-gan.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/tutorials/2020-09-15-deep-learning-flux.md b/docs/src/tutorials/2020-09-15-deep-learning-flux.md index efd89727c5..fc5d3da357 100755 --- a/docs/src/tutorials/2020-09-15-deep-learning-flux.md +++ b/docs/src/tutorials/2020-09-15-deep-learning-flux.md @@ -1,4 +1,4 @@ -# Deep Learning with Julia & Flux: A 60 Minute Blitz +# [Deep Learning with Julia & Flux: A 60 Minute Blitz](@id man-blitz) This is a quick intro to [Flux](https://github.com/FluxML/Flux.jl) loosely based on [PyTorch's tutorial](https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html). It introduces basic Julia programming, as well Zygote, a source-to-source automatic differentiation (AD) framework in Julia. We'll use these tools to build a very simple neural network. diff --git a/docs/src/tutorials/2021-01-26-mlp.md b/docs/src/tutorials/2021-01-26-mlp.md index 54831834c8..9601429c48 100644 --- a/docs/src/tutorials/2021-01-26-mlp.md +++ b/docs/src/tutorials/2021-01-26-mlp.md @@ -1,4 +1,4 @@ -# Tutorial: Simple Multi-layer Perceptron +# [Tutorial: Simple Multi-layer Perceptron](@id man-mlp-tutorial) In this example, we create a simple [multi-layer perceptron](https://en.wikipedia.org/wiki/Multilayer_perceptron#:~:text=A%20multilayer%20perceptron%20(MLP)%20is,artificial%20neural%20network%20(ANN).&text=An%20MLP%20consists%20of%20at,uses%20a%20nonlinear%20activation%20function.) (MLP) that classifies handwritten digits using the MNIST dataset. A MLP consists of at least *three layers* of stacked perceptrons: Input, hidden, and output. Each neuron of an MLP has parameters (weights and bias) and uses an [activation function](https://en.wikipedia.org/wiki/Activation_function) to compute its output. diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index ed9996ccec..99a64ed2d0 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -1,4 +1,4 @@ -# Tutorial: A Simple ConvNet +# [Tutorial: A Simple ConvNet](@id man-convnet-tutorial) In this tutorial, we build a simple Convolutional Neural Network (ConvNet) to classify the MNIST dataset. This model has a simple architecture with three feature detection layers (Conv -> ReLU -> MaxPool) followed by a final dense layer that classifies MNIST handwritten digits. Note that this model, while simple, should hit around 99% test accuracy after training for approximately 20 epochs. diff --git a/docs/src/tutorials/2021-10-08-dcgan-mnist.md b/docs/src/tutorials/2021-10-08-dcgan-mnist.md index 31b1ebb914..c0960bf636 100644 --- a/docs/src/tutorials/2021-10-08-dcgan-mnist.md +++ b/docs/src/tutorials/2021-10-08-dcgan-mnist.md @@ -1,4 +1,4 @@ -# Tutorial: Deep Convolutional Generative Adversarial Network (DCGAN) +# Deep Convolutional Generative Adversarial Network (DCGAN) This is a beginner level tutorial for generating images of handwritten digits using a [Deep Convolutional Generative Adversarial Network](https://arxiv.org/pdf/1511.06434.pdf) inspired by the [TensorFlow tutorial on DCGAN](https://www.tensorflow.org/tutorials/generative/dcgan). diff --git a/docs/src/tutorials/2021-10-14-vanilla-gan.md b/docs/src/tutorials/2021-10-14-vanilla-gan.md index 2647504a84..b2c7bb6f4c 100644 --- a/docs/src/tutorials/2021-10-14-vanilla-gan.md +++ b/docs/src/tutorials/2021-10-14-vanilla-gan.md @@ -1,4 +1,4 @@ -# Tutorial: Generative Adversarial Networks +# [Tutorial: Generative Adversarial Networks](](@id man-gan-tutorial)) This tutorial describes how to implement a vanilla Generative Adversarial Network using Flux and how train it on the MNIST dataset. It is based on this From 55836fff986881b947bf6ad06d155fb6a045d1b9 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 24 Nov 2022 20:02:00 -0500 Subject: [PATCH 03/11] somehow fix images + links for DCGAN --- docs/src/tutorials/2021-10-08-dcgan-mnist.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/docs/src/tutorials/2021-10-08-dcgan-mnist.md b/docs/src/tutorials/2021-10-08-dcgan-mnist.md index c0960bf636..be966bebe1 100644 --- a/docs/src/tutorials/2021-10-08-dcgan-mnist.md +++ b/docs/src/tutorials/2021-10-08-dcgan-mnist.md @@ -7,7 +7,7 @@ This is a beginner level tutorial for generating images of handwritten digits us A GAN is composed of two sub-models - the **generator** and the **discriminator** acting against one another. The generator can be considered as an artist who draws (generates) new images that look real, whereas the discriminator is a critic who learns to tell real images apart from fakes. -![](../../assets/tutorialposts/2021-10-8-dcgan-mnist/cat_gan.png) +![](https://fluxml.ai/assets/tutorialposts/2021-10-08-dcgan-mnist/cat_gan.png) The GAN starts with a generator and discriminator which have very little or no idea about the underlying data. During training, the generator progressively becomes better at creating images that look real, while the discriminator becomes better at telling them apart. The process reaches equilibrium when the discriminator can no longer distinguish real images from fakes. @@ -18,12 +18,7 @@ The GAN starts with a generator and discriminator which have very little or no i This tutorial demonstrates the process of training a DC-GAN on the [MNIST dataset for handwritten digits](http://yann.lecun.com/exdb/mnist/). The following animation shows a series of images produced by the generator as it was trained for 25 epochs. The images begin as random noise, but over time, the images become increasingly similar to handwritten numbers. -~~~ -

-

- -

-~~~ +![](https://fluxml.ai/assets/tutorialposts/2021-10-08-dcgan-mnist/output.gif) ## Setup @@ -94,7 +89,7 @@ To learn more about loading images in Flux, you can check out [this tutorial](ht ## Create the models -### The generator +### Generator Our generator, a.k.a. the artist, is a neural network that maps low dimensional data to a high dimensional form. @@ -350,12 +345,10 @@ gif_mat = cat(images..., dims=3) save("./output.gif", gif_mat) ``` -

- -

+![](https://fluxml.ai/assets/tutorialposts/2021-10-08-dcgan-mnist/output.gif) ## Resources & References -- [The DCGAN implementation in Model Zoo.](http=s://github.com/FluxML/model-zoo/blob/master/vision/dcgan_mnist/dcgan_mnist.jl) +- [The DCGAN implementation in the Model Zoo.](https://github.com/FluxML/model-zoo/blob/master/vision/dcgan_mnist/dcgan_mnist.jl) !!! info Originally published at [fluxml.ai](https://fluxml.ai/tutorials/) on 8 October 2021, From 009192b26278d01bb5e654b6d86e2fe0790c700a Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Thu, 24 Nov 2022 21:52:23 -0500 Subject: [PATCH 04/11] using Flux: params --- docs/src/tutorials/2021-01-26-mlp.md | 2 +- docs/src/tutorials/2021-02-07-convnet.md | 2 +- docs/src/tutorials/2021-10-08-dcgan-mnist.md | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/src/tutorials/2021-01-26-mlp.md b/docs/src/tutorials/2021-01-26-mlp.md index 9601429c48..d2df9ddf84 100644 --- a/docs/src/tutorials/2021-01-26-mlp.md +++ b/docs/src/tutorials/2021-01-26-mlp.md @@ -7,7 +7,7 @@ To run this example, we need the following packages: ```julia using Flux, Statistics using Flux.Data: DataLoader -using Flux: onehotbatch, onecold, logitcrossentropy, throttle, @epochs +using Flux: onehotbatch, onecold, logitcrossentropy, throttle, @epochs, params using Base.Iterators: repeated using Parameters: @with_kw using CUDA diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 99a64ed2d0..4824365a3d 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -8,7 +8,7 @@ To run this example, we need the following packages: ```julia using Flux, MLDatasets, Statistics -using Flux: onehotbatch, onecold, logitcrossentropy +using Flux: onehotbatch, onecold, logitcrossentropy, params using MLDatasets: MNIST using Base.Iterators: partition using Printf, BSON diff --git a/docs/src/tutorials/2021-10-08-dcgan-mnist.md b/docs/src/tutorials/2021-10-08-dcgan-mnist.md index be966bebe1..250ed22c3e 100644 --- a/docs/src/tutorials/2021-10-08-dcgan-mnist.md +++ b/docs/src/tutorials/2021-10-08-dcgan-mnist.md @@ -43,8 +43,7 @@ using Statistics using Random using Images using Parameters: @with_kw -using Flux -using Flux.Data: DataLoader +using Flux: params, DataLoader using Flux.Optimise: update! using Flux.Losses: logitbinarycrossentropy using MLDatasets: MNIST From 2aa2a7a7561de913a6fb2e131dd87aa905c1d97c Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 08:27:02 -0500 Subject: [PATCH 05/11] rm indents --- docs/src/tutorials/2021-02-07-convnet.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 4824365a3d..1462e1348a 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -104,22 +104,21 @@ Before training our model, we need to define a few functions that will be helpfu * `augment` augments the data by adding gaussian random noise to our image to make it more robust: - ```julia - augment(x) = x .+ gpu(0.1f0*randn(eltype(x), size(x))) - ``` - - +```julia +augment(x) = x .+ gpu(0.1f0*randn(eltype(x), size(x))) +``` + * `anynan` checks whether any element of the params is NaN or not: - ```julia - anynan(x) = any(y -> any(isnan, y), x) - ``` +```julia + anynan(x) = any(y -> any(isnan, y), x) +``` * `accuracy` computes the accuracy of our ConvNet: - ```julia - accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) - ``` +```julia + accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) +``` Finally, we define the `train` function: @@ -222,7 +221,7 @@ end Finally, to test our model we define the `test` function: - + ```julia function test(; kws...) args = Args(; kws...) From 02e9d2066528ea8aa734ab2d00aeb7c44f114593 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 08:49:52 -0500 Subject: [PATCH 06/11] ADAM --- docs/src/tutorials/2021-01-26-mlp.md | 4 ++-- docs/src/tutorials/2021-02-07-convnet.md | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/tutorials/2021-01-26-mlp.md b/docs/src/tutorials/2021-01-26-mlp.md index d2df9ddf84..c9ee9897a0 100644 --- a/docs/src/tutorials/2021-01-26-mlp.md +++ b/docs/src/tutorials/2021-01-26-mlp.md @@ -138,7 +138,7 @@ function train(; kws...) ## Training evalcb = () -> @show(loss_all(train_data, m)) - opt = ADAM(args.η) + opt = Adam(args.η) @epochs args.epochs Flux.train!(loss, params(m), train_data, opt, cb = evalcb) @@ -154,7 +154,7 @@ end * **Initializes the model parameters:** Creates the `args` object that contains the defult values for training our model. * **Loads the train and test data:** Calls the function `getdata` we defined above. * **Constructs the model:** Builds the model and loads the train and test data sets, and our model onto the GPU (if available). -* **Trains the model:** Defines the *callback* function `evalcb` to show the value of the `loss_all` function during the training process. Then, it sets [ADAM](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.ADAM) as the optimiser for training out model. Finally, it runs the training process with the macro `@epochs` for `10` epochs (as defined in the `args` object) and shows the `accuracy` value for the train and test data. +* **Trains the model:** Defines the *callback* function `evalcb` to show the value of the `loss_all` function during the training process. Then, it sets [Adam](@ref Flux.Optimise.Adam) as the optimiser for training out model. Finally, it runs the training process with the macro `@epochs` for `10` epochs (as defined in the `args` object) and shows the `accuracy` value for the train and test data. To see the full version of this example, see [Simple multi-layer perceptron - model-zoo](https://github.com/FluxML/model-zoo/blob/master/vision/mlp_mnist/mlp_mnist.jl). diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 1462e1348a..7fa32e58bb 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -151,9 +151,9 @@ function train(; kws...) return logitcrossentropy(ŷ, y) end - # Train our model with the given training set using the ADAM optimizer and + # Train our model with the given training set using the Adam optimizer and # printing out performance against the test set as we go. - opt = ADAM(args.lr) + opt = Adam(args.lr) @info("Beginning training loop...") best_acc = 0.0 @@ -209,7 +209,7 @@ end * Builds our ConvNet model (as described above). * Loads the train and test data sets as well as our model onto a GPU (if available). * Defines a `loss` function that calculates the crossentropy between our prediction and the ground truth. - * Sets the [ADAM optimiser](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.ADAM) to train the model with learning rate `args.lr`. + * Sets the [Adam optimiser](https://fluxml.ai/Flux.jl/stable/training/optimisers/#Flux.Optimise.Adam) to train the model with learning rate `args.lr`. * Runs the training loop. For each step (or epoch), it executes the following: * Calls `Flux.train!` function to execute one training step. * If any of the parameters of our model is `NaN`, then the training process is terminated. From a1ab2d0a551633b4751c6d0ceaf4884dedf013fe Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 08:58:21 -0500 Subject: [PATCH 07/11] rm using Parameters, and use distinct names --- docs/src/tutorials/2021-01-26-mlp.md | 7 +++---- docs/src/tutorials/2021-02-07-convnet.md | 7 +++---- docs/src/tutorials/2021-10-08-dcgan-mnist.md | 3 +-- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/docs/src/tutorials/2021-01-26-mlp.md b/docs/src/tutorials/2021-01-26-mlp.md index c9ee9897a0..7b2b530518 100644 --- a/docs/src/tutorials/2021-01-26-mlp.md +++ b/docs/src/tutorials/2021-01-26-mlp.md @@ -9,7 +9,6 @@ using Flux, Statistics using Flux.Data: DataLoader using Flux: onehotbatch, onecold, logitcrossentropy, throttle, @epochs, params using Base.Iterators: repeated -using Parameters: @with_kw using CUDA using MLDatasets if has_cuda() # Check if CUDA is available @@ -21,8 +20,8 @@ end We set default values for learning rate, batch size, epochs, and the usage of a GPU (if available) for our model: ```julia -@with_kw mutable struct Args - η::Float64 = 3e-4 # learning rate +Base.@kwdef mutable struct Args + rate::Float64 = 3e-4 # learning rate batchsize::Int = 1024 # batch size epochs::Int = 10 # number of epochs device::Function = gpu # set as gpu, if gpu available @@ -138,7 +137,7 @@ function train(; kws...) ## Training evalcb = () -> @show(loss_all(train_data, m)) - opt = Adam(args.η) + opt = Adam(args.rate) @epochs args.epochs Flux.train!(loss, params(m), train_data, opt, cb = evalcb) diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 7fa32e58bb..3620d27205 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -12,7 +12,6 @@ using Flux: onehotbatch, onecold, logitcrossentropy, params using MLDatasets: MNIST using Base.Iterators: partition using Printf, BSON -using Parameters: @with_kw using CUDA CUDA.allowscalar(false) ``` @@ -20,7 +19,7 @@ CUDA.allowscalar(false) We set default values for learning rate, batch size, number of epochs, and path for saving the file `mnist_conv.bson`: ```julia -@with_kw mutable struct Args +Base.@kwdef mutable struct TrainArgs lr::Float64 = 3e-3 epochs::Int = 20 batch_size = 128 @@ -124,7 +123,7 @@ Finally, we define the `train` function: ```julia function train(; kws...) - args = Args(; kws...) + args = TrainArgs(; kws...) @info("Loading data set") train_set, test_set = get_processed_data(args) @@ -224,7 +223,7 @@ Finally, to test our model we define the `test` function: ```julia function test(; kws...) - args = Args(; kws...) + args = TrainArgs(; kws...) # Loading the test data _,test_set = get_processed_data(args) diff --git a/docs/src/tutorials/2021-10-08-dcgan-mnist.md b/docs/src/tutorials/2021-10-08-dcgan-mnist.md index 250ed22c3e..9a71a8ade8 100644 --- a/docs/src/tutorials/2021-10-08-dcgan-mnist.md +++ b/docs/src/tutorials/2021-10-08-dcgan-mnist.md @@ -42,7 +42,6 @@ using Printf using Statistics using Random using Images -using Parameters: @with_kw using Flux: params, DataLoader using Flux.Optimise: update! using Flux.Losses: logitbinarycrossentropy @@ -53,7 +52,7 @@ using CUDA Now we set default values for the learning rates, batch size, epochs, the usage of a GPU (if available) and other hyperparameters for our model. ```julia -@with_kw struct HyperParams +Base.@kwdef struct HyperParams batch_size::Int = 128 latent_dim::Int = 100 epochs::Int = 25 From 52b96535d9d311f927ac92699e237ce2cd525e72 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:06:59 -0500 Subject: [PATCH 08/11] local image files --- .../assets/2021-10-08-dcgan-mnist/cat_gan.png | Bin 0 -> 1173514 bytes .../assets/2021-10-08-dcgan-mnist/output.gif | Bin 0 -> 182397 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/assets/2021-10-08-dcgan-mnist/cat_gan.png create mode 100644 docs/src/assets/2021-10-08-dcgan-mnist/output.gif diff --git a/docs/src/assets/2021-10-08-dcgan-mnist/cat_gan.png b/docs/src/assets/2021-10-08-dcgan-mnist/cat_gan.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b59c5adb5eb0734eb90d4d7bd4051b68542dc5 GIT binary patch literal 1173514 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 KXT$D%`u_o;+%VGs literal 0 HcmV?d00001 diff --git a/docs/src/assets/2021-10-08-dcgan-mnist/output.gif b/docs/src/assets/2021-10-08-dcgan-mnist/output.gif new file mode 100644 index 0000000000000000000000000000000000000000..33435edbcc418a6a10f3e3803e2e50a01ae1b95a GIT binary patch literal 182397 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

%aEdF!ksT3u<)McYfL|fWEwx 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 literal 0 HcmV?d00001 From 6930d243f7de7403aa89dc8410e2b30042859e06 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:09:37 -0500 Subject: [PATCH 09/11] kill those bullet points --- docs/src/tutorials/2021-02-07-convnet.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 3620d27205..2a4b3fbcdc 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -97,28 +97,26 @@ end To chain the layers of a model we use the Flux function [Chain](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Chain). It enables us to call the layers in sequence on a given input. Also, we use the function [flatten](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.flatten) to reshape the output image from the last convolution layer. Finally, we call the [Dense](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Dense) function to create the classification layer. - Before training our model, we need to define a few functions that will be helpful for the process: +`augment` adds gaussian random noise to our image, to make it more robust: -* `augment` augments the data by adding gaussian random noise to our image to make it more robust: - ```julia augment(x) = x .+ gpu(0.1f0*randn(eltype(x), size(x))) ``` -* `anynan` checks whether any element of the params is NaN or not: - +`anynan` checks whether any element of the params is NaN or not: + ```julia - anynan(x) = any(y -> any(isnan, y), x) +anynan(x) = any(y -> any(isnan, y), x) ``` - -* `accuracy` computes the accuracy of our ConvNet: - + +`accuracy` computes the proportion of inputs `x` correctly classified by our ConvNet: + ```julia - accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) +accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) ``` - + Finally, we define the `train` function: ```julia From 32d28a7cbec99169d690a3e810947916a918a5ea Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:31:07 -0500 Subject: [PATCH 10/11] restore some bullets --- docs/src/tutorials/2021-02-07-convnet.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index 2a4b3fbcdc..fc08e9c344 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -99,21 +99,13 @@ To chain the layers of a model we use the Flux function [Chain](https://fluxml.a Before training our model, we need to define a few functions that will be helpful for the process: -`augment` adds gaussian random noise to our image, to make it more robust: +* `augment` adds gaussian random noise to our image, to make it more robust: +* `anynan` checks whether any element of the params is NaN or not: +* `accuracy` computes the proportion of inputs `x` correctly classified by our ConvNet: ```julia augment(x) = x .+ gpu(0.1f0*randn(eltype(x), size(x))) -``` - -`anynan` checks whether any element of the params is NaN or not: - -```julia anynan(x) = any(y -> any(isnan, y), x) -``` - -`accuracy` computes the proportion of inputs `x` correctly classified by our ConvNet: - -```julia accuracy(x, y, model) = mean(onecold(cpu(model(x))) .== onecold(cpu(y))) ``` From 15040d33d43566f77e3bc815a10d6f4afee28784 Mon Sep 17 00:00:00 2001 From: Michael Abbott <32575566+mcabbott@users.noreply.github.com> Date: Fri, 25 Nov 2022 09:32:44 -0500 Subject: [PATCH 11/11] add some headings --- docs/src/tutorials/2021-02-07-convnet.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/src/tutorials/2021-02-07-convnet.md b/docs/src/tutorials/2021-02-07-convnet.md index fc08e9c344..cceb49da9e 100644 --- a/docs/src/tutorials/2021-02-07-convnet.md +++ b/docs/src/tutorials/2021-02-07-convnet.md @@ -26,7 +26,9 @@ Base.@kwdef mutable struct TrainArgs savepath::String = "./" end ``` - + +## Data + To train our model, we need to bundle images together with their labels and group them into mini-batches (makes the training process faster). We define the function `make_minibatch` that takes as inputs the images (`X`) and their labels (`Y`) as well as the indices for the mini-batches (`idx`): ```julia @@ -66,7 +68,8 @@ function get_processed_data(args) end ``` - + +## Model Now, we define the `build_model` function that creates a ConvNet model which is composed of *three* convolution layers (feature detection) and *one* classification layer. The input layer size is `28x28`. The images are grayscale, which means there is only *one* channel (compared to 3 for RGB) in every data point. Combined together, the convolutional layer structure would look like `Conv(kernel, input_channels => output_channels, ...)`. Each convolution layer reduces the size of the image by applying the Rectified Linear unit (ReLU) and MaxPool operations. On the other hand, the classification layer outputs a vector of 10 dimensions (a dense layer), that is, the number of classes that the model will be able to predict. @@ -97,6 +100,8 @@ end To chain the layers of a model we use the Flux function [Chain](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Chain). It enables us to call the layers in sequence on a given input. Also, we use the function [flatten](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.flatten) to reshape the output image from the last convolution layer. Finally, we call the [Dense](https://fluxml.ai/Flux.jl/stable/models/layers/#Flux.Dense) function to create the classification layer. +## Training + Before training our model, we need to define a few functions that will be helpful for the process: * `augment` adds gaussian random noise to our image, to make it more robust: @@ -208,7 +213,9 @@ end * If there has not been any improvement for the last 5 epochs, then the learning rate is dropped and the process waits a little longer for the accuracy to improve. * If the last improvement was more than 10 epochs ago, then the process is terminated. - + +## Testing + Finally, to test our model we define the `test` function: ```julia