Importing the Relevant Libraries

Make sure to remove CUDA if you don’t have an Nvidia GPU.

using Plots, Flux, LinearAlgebra, CUDA, ProgressMeter
using Flux: @functor
using Statistics: mean
using MLDatasets: MNIST

Defining the Neural Network

Creating a Module Instance

Julia does not offer class-based object-orientation like Python does, so if you’re coming from PyTorch, then things look quite a bit different – but also not completely different. The fundamental paradigm of Julia’s design is multiple-dispatch, so pretty much everything we heavily rely on function-overloading. If those two terms are foreign to you, I recommend prompting your favorite LLM or search engine about them before continuing.

First thing we need to do is to create a struct to hold our layers/submodules. Let’s as an example loook at a block of a residual neural network:

struct ResNetBlock
    conv1
    conv2
    skipconv
end

Julia will already offer you a default inner constructor for this struct by calling ResNetBlock(arg1, arg2, arg3), but we will create an additional outer constructor that makes sure that arg1, arg2 and arg3 are actually the layers that we want to end up in the struct’s attributes. An outer constructor is not really a built-in property of the language, but it is simply an overloaded function of the inner constructor that returns an instance of the struct. Since we did not specify what type the struct’s attributes should have, the signature of the inner constructor would look like this, taking any types of input arguments and returning an instance of ResNetBlock, i.e. ResNetBlock(::Any, ::Any, ::Any)::ResNetBlock.

We will now overload this by defining the following outer constructor, which takes two Integer (the super-type for any integer type in Julia) and returns an instance of ResNetBlock by calling the inner constructor and passing the layers that we actually want to have in those attributes. Also realize that return is not needed in Julia, but could be added for readability.

function ResNetBlock(in_channels::Integer, out_channels::Integer)
    ResNetBlock(
        Conv((3,3), in_channels => out_channels, pad=SamePad()),
        Conv((3,3), out_channels => out_channels, pad=SamePad()),
        Conv((1,1), in_channels => out_channels, pad=SamePad())
    )
end

Output:

ResNetBlock

Making our Module behave like a Function

In PyTorch we would use __call__ or forward functions to make objects callable. In Julia we can define function-like objects or functors by creating methods that have the instance of the struct as the method signature. We also type-annotate the passed argument as some kind of array with single-precision floats of dimension 4 – AbstractArray is the super-type of all Julia arrays, such as the standard Array, but also the CuArray for Nvidia GPUs.

function (m::ResNetBlock)(x::AbstractArray{Float32, 4})
    skip = m.skipconv(x)
    x = relu(m.conv1(x))
    x = m.conv2(x) + skip
    return relu(x)
end

As the final step we need to ensure that our ResNetBlock behaves like a neural network module. This means that it should be able to recursively load all parameters so that we can either differentiate with respect to them (for training), or that we can copy all of them together between our CPU and our GPU. In PyTorch, this would be taken care of by subclassing nn.Module, in Flux, this is taken care of by registering our module as a @functor.

@functor ResNetBlock

Repeating the same for the final network structure

struct ResNetMNIST
    convs
    pool
    fc
end

function ResNetMNIST()
    conv1 = ResNetBlock(1, 64)
    conv2 = ResNetBlock(64, 128)
    conv3 = ResNetBlock(128, 256)
    pool = MaxPool((2,2), pad=SamePad())
    out_feat = 256 * 4 * 4
    fc = Dense(out_feat => 10)
    return ResNetMNIST(
        [conv1, conv2, conv3],
        pool,
        fc
    )
end

function (m::ResNetMNIST)(x::AbstractArray{Float32, 4})
    for conv in m.convs
        x = m.pool(conv(x))
    end
    bs = size(x, ndims(x))
    other = div(length(x), size(x,4))
    return m.fc(reshape(x, (other, bs)))
end

@functor ResNetMNIST

Loading the Dataset

This will look very familiar to the PyTorch user, except maybe that we use a weird :train statement to load our training split. :train is of type Symbol, bu explaining Julia’s symbols is out of the scope of this article. One important thing to note here is that the array dimension order in Flux will be inverted compared to PyTorch: PyTorch uses the B C H W orientation, whereas Flux uses W H C B.

bs = 8
train_ds = MNIST(:train)
test_ds = MNIST(:test)
train_dl = Flux.DataLoader(dataset, batchsize=bs, shuffle=true)
test_dl = Flux.DataLoader(dataset, batchsize=bs, shuffle=false)

Output:

7500-element DataLoader(::MNIST, batchsize=8)
  with first element:
  (; features = 28Γ—28Γ—8 Array{Float32, 3}, targets = 8-element Vector{Int64})

The Training Loop

Julia has an emphasis on the functional programming paradigm and Flux’s autodifferntiation engine Zygote also makes use of that. Therefore the syntax of computing gradients is much more similar to JAX than to PyTorch. You need to remind yourself of the mathematical definition of our optimization problem: We want to find the optimal parameters of our model by minimizing a loss between the true class distribution of our data $p(c|x)$ and our predicted class distribution $NN(c|\theta, x)$.

$$ \theta^\star = \argmin_{\theta}\mathcal{L} (f(c|\theta, x), p(c|x)) $$

We do this by gradient descent, so in every optimization step we need to calculate

$$ \frac{\partial \mathcal{L} (f(c|\theta, x), p(c|x))}{\partial \theta} $$

which is why we need to create a function that takes the model (the parameters $\theta$) as input and returns the loss, so that we can then differentiate that function by the model.

$$ \theta \mapsto \mathcal{L} (f(c|\theta, x), p(c|x)) $$

In Julia we can define such a function in a single line (assuming that img and target are variables within the scope of the function)

loss(m) = Flux.logitcrossentropy(m(img), target)

For any function, e.g. func(arg1, arg2), Flux allows you to calculate gradients with respect to its passed parameter as

grad1, grad2 = Flux.gradient(func, arg1, arg2)

and since our function only takes the model as its parameters, we can get the gradients as

model = ResNetMNIST()
grads_theta = Flux.gradient(loss, model)

or additionally we can get the loss value returned by using Flux.withgradient(loss, model). With this knowledge we are now able to formulate our training loop.

model = ResNetMNIST() |> gpu 
optim = Flux.setup(Flux.Adam(0.0001), model)

epochs = 30
train_losses = []
test_losses = []
classes = 0:9

@showprogress for epoch in 1:epochs
    train_losses_step = []
    for (i,x) in enumerate(dataloader)
        img = x.features |> gpu
        img = reshape(img, (28, 28, 1, size(img)[end]))
        target = x.targets
        target = Flux.onehotbatch(target, classes) |> gpu

        loss(m) = Flux.logitcrossentropy(m(img), target)

        loss, grads = Flux.withgradient(loss, model)
        
        Flux.update!(optim, model, grads[1])
        push!(train_losses_step, loss |> cpu)
    end
    push!(train_losses, mean(train_losses_step))

    test_losses_step = []
    for (i,x) in enumerate(dataloader)
        img = x.features |> gpu
        img = reshape(img, (28, 28, 1, size(img)[end]))
        target = x.targets
        target = Flux.onehotbatch(target, classes) |> gpu

        loss(m) = Flux.logitcrossentropy(m(img), target)

        loss = loss(model)
        
        push!(test_losses_step, loss |> cpu)
    end
    push!(test_losses, mean(test_losses_step))
end

Output:

Progress: 100%|β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| Time: 0:03:50
p1 = plot(train_losses, xlabel="steps", ylabel="loss", label="train loss")
p2 = plot(test_losses, xlabel="steps", ylabel="loss", label="test loss")
plot(p1, p2, layout = 2, fmt=:png, size=(900, 400))

Output:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4QAAAGQCAIAAAB59DnIAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdd3xT5f4H8O8ZadImHXRR2kJpaSktmwItQ/ZUQDYIigoyHDgBQRGBiwiCiKLenwsVQVHWZcouYi+CyN5CW2iBFuigI23T5Jzz+yPai2V0neQkJ5/3yz+ScJp8W9uTT57n+T6HkSSJAAAAAACUwCpdAAAAAAC4LoRRAAAAAFAMwigAAAAAKAZhFAAAAAAUgzAKAAAAAIpBGAUAAAAAxSCMAgAAAIBiEEYBAAAAQDEIowAAAACgGIRRAAAAAFCMo4fR77///o8//lC6iqqRJMlisShdRXWIoigIgtJVVIcgCKIoKl1FdTjprwoRmc1mpUuoJuetvObee++9zMxMpauoGlEUnfev20kvuO28fyOo3P5kqdzRw+jevXtPnDihdBVVI0lSaWmp0lVUhyAITpqNzGazk8Zok8nkpG+0JSUlSpdQTc5bec2tX7/+ypUrSldRNRaLxXnPS076120ymZQuoZqc96/bxSt39DAKAAAAACqGMAoAAAAAikEYBQAAAADFIIwCAAAAgGIQRgEAAABAMQijAAAAAKAYhFEAAAAAUAzCKAAAAAAoxunD6KsHhWxn3Z0XAMCBSERP/eKUF48AAKfm9GF073UpvdApr7cGAOBQGKI1qaLRKa92BABOzOnDqEFDOHUC3O3MmTMcxzE24+XlZbsntxGNRpOamqr0/xmH5qdlskrw8R6gArNnz5b37OSMZ1QfHx9Jkud0oYYwWmhWuggAx5Ofnx8fHy/BHWJiYgoLC5X+P+PQ/HWU7ayXyAawn9u3by9dulTpU5rCCgoKJIRRKz3PFJrxOR4AQAZ+OsrCKnwAsC+nD6MGDRVimh4AQA7+OkzTA4C9qSKMYpoeAEAO/lpM0wOAvTl/GOXRwAQAIA8/HWWbMDIKAHbl9GFUr2GMWDMKACAHPy2ThZFRALAvpw+jBh5rRgEA5OGvI1xGBADszOnDqB5rRgGcTW5u7rlz5yp58NmzZ3Nzc21aD5TxQwMTgKodOXKkpMThpj+cPowaeIRRACXdvn377bffrtKXJCYmPv/885U8+Lnnntu3b1+Vy4JqQQMTgEP55Zdf1q9fX9WvOn78+PLly+/5T3369ElPT69xXTJz/jCKrZ0AFJWXl/fBBx9U6Uv69Onz/fff26geqAk/HWHNKIDjOHjw4Pbt26v6VWfPnl2zZo0t6rERFYRRNDABKOnNN98sLi4ePnz48OHDMzIy1q5d+3//939Tp05t2rTpr7/++ssvvwwaNKh58+a9evXasmWL9UtOnDjx8ccfE1FhYeHw4cP37NnTuXPnhISEChPq559/3qVLlw4dOixatEgQBOszvPDCCy1btoyLi7OOtoqiOHfu3Pj4+BYtWgwfPjw/P9/GPwBV8dcxWeimB3AMZ8+eXbVq1Z49e4YPHz59+nQiMplMb7/9drt27bp167Z69WrrYadPnx40aFDTpk07duy4YsWKGzdufPTRR8ePHx8+fPj48ePv9+Rms3nu3LkJCQndu3dftWqV9cH09PTHH3+8adOmCQkJixYtIqLCwsLJkydbz7HPPfecjb5T3kbPazdoYAKojGILlQjyPBXLkLfb/+4+//zz//nPfxYsWEBE/v7+Z86cWbx48dKlSydNmlSrVq1Tp05Nnz49IiLi9OnTo0aN2rdvX3R0dEZGxoEDB4iotLR0zZo1bm5uy5cvT0lJGTRo0EMPPVS3bt17vu7XX3+9aNGiH3/80d3d/fHHHzeZTDNnzly0aFFOTs727dtFUTx8+DARrVu3btu2bT/99JO7u/vRo0dZ1uk/ctuTniciKraQu9O/OQDYT76ZBFGep9Jx//vri4iI6Nu375UrV+bPn6/Vaolo7NixGo3mxx9/zMnJGTFihK+vb69evcaMGfPss88OHTo0KysrMzPT19d35MiRGzZsWLBgAcdx93uhGTNmHD58eOXKlTdv3hw+fLherx84cODLL78cGxv74YcfFhYWXrhwgYgWL15869atn3/+WZIk6znWFpz+fIMGJoDKaLvRcq1IthGvDT34znUY6+3g4GCWZSMiIsr+tVOnTuPGjbPe7ty58/Xr10+dOpWdnR0dHW0No+WebeHChSEhIQ0aNGjduvXRo0fvF0a//PLLmTNntmrViojefffdCRMmzJw5s6ioyGQylZSUhIWFDRgwgIiKi4stFkt+fn5YWFifPn3k+pZdh6+WyTJJdXlG6UIAnMPvt6Q+22UbFfPXMReG/fXnp9PpfH19c3NzrSfYzMzMDRs25OTk6HS64ODgiRMnfv/997169SoqKsrPz+d5PioqKioqiogCAwM9PDzu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" />