Step 2: unfreeze the top, retrain with a tiny learning rate
Once the head is trained and your accuracy has settled, fine-tuning squeezes out the rest. You flip base_model.trainable = True and then re-freeze everything except the last handful of layers. Why only the top? The early layers hold the universal edge/texture detectors you want to keep; the later layers hold the ImageNet-specific concepts that are worth gently bending toward your task.
The learning rate is the whole game
The single most important number here is the learning rate, dropped to roughly 1e-5 — about 100× lower than normal training. Your pretrained weights are already near a good solution; a normal-sized LR would take huge steps and wreck them (catastrophic forgetting). The tiny LR nudges them just enough to specialize without unlearning. Fine-tune for ~10–20 more epochs and watch validation accuracy — if it stops improving or starts overfitting, stop. The Code section walks the exact freeze/recompile/fit sequence.