I have a neural network and I am plotting its decision boundary using a trick with contourf!
(basically make a 2D grid of points then apply the neural network to classify each point; contour line will end up on the decision boundary since there are only two levels). Now I want to do this plot every so often so I can see the boundary update as I train the neural network.
One thing I have considered is to make a Node
with my neural network inside, but it really just seems easier to delete the old contour plot and re-plot it. Is there a way to do this in Makie?
Here’s the relevant plotting code:
function decisionboundary!(axis, m; f = x -> x > 0 ? 1 : 0, npts = 200, fill = false, pltargs...)
xmin = 0.9 * minimum(axis.limits[])[1]
xmax = 0.9 * maximum(axis.limits[])[1]
ymin = 0.9 * minimum(axis.limits[])[2]
ymax = 0.9 * maximum(axis.limits[])[2]
Δx = (xmax - xmin) / npts
Δy = (ymax - ymin) / npts
x = range(xmin, step = Δx, length = npts)
y = range(ymin, step = Δy, length = npts)
features = vcat(repeat(reshape(x, 1, :), inner = (1, npts)), repeat(reshape(y, 1, :), outer = (1, npts)))
Y = _applymodel(m, f, features, npts) # my attempt to lift the neural network
if all(Y .== first(Y))
@warn "Not drawing decision boundary because there is only one resulting class"
return nothing
end
return fill ? contourf!(axis, vec(x), vec(y), Y; linewidth = 2, levels = 1, pltargs...) :
contour!(axis, vec(x), vec(y), Y; linewidth = 2, levels = 1, pltargs...)
end
function _applymodel(m, f, features, npts)
Y = m(features)
if size(Y, 1) == 1
Y = f.(Y)
else
Y = f.(eachcol(Y))
end
Y = permutedims(reshape(Y, npts, npts))
return Y
end
_applymodel(m::Node, f, features, npts) = @lift(_applymodel($m, f, features, npts))