These examples are all reimplementations of the keras examples unless otherwise stated and I am implementing them with equinox, a Jax library which is used to represent parameterised functions as pytrees.
Tensorflow is bloated. This means it is a very large package with lots of useless redundancy and legacy features; tensorflow is therefore hard to understand. Tensorflow is also (often) very slow. I cannot say the same about pytorch as I have little experience with it. However, equinox is fast, lightweight and easy to use.
note: some values such as accuracy may differ from the keras examples to the random nature of machine learning