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:
[32mProgress: 100%|βββββββββββββββββββββββββββββββββββββββββ| Time: 0:03:50[39m[K
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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" />