Weights without the architecture
Sometimes you don't want the whole model — you want just the trained numbers. save_weights writes only the tensors, leaving the architecture out entirely. That makes the file smaller and the save faster, which is exactly what you want when you're checkpointing every few epochs during a long training run.
The catch: you rebuild the architecture yourself
Because the architecture isn't in the file, loading is a two-step dance: construct the model in code first, then pour the weights in with load_weights. The model you build must match the saved one layer-for-layer — same shapes, same order. If it doesn't, the load can fail loudly or, worse, silently misalign tensors. That's the tradeoff against .keras: you trade self-describing safety for size and speed, and you take on the responsibility of keeping the build code in sync.
Sharding the giants
For very large models, a single weights file becomes unwieldy. Keras 3.10+ lets you cap the shard size with max_shard_size — pass "2GB" and the weights are split across multiple files automatically, which keeps each piece under filesystem and upload limits. Loading reassembles them transparently.