Custom Training Loops with GradientTape: Manual Forward and Backward Passes in TensorFlow
model.fit() hides the training loop. GradientTape exposes it. Use it when you need per-batch gradient manipulation, custom loss combinations, or training dynamics that Keras callbacks can't express.