The four checks you'll run a thousand times
Almost every TF debugging session begins with calling .shape and .dtype on whatever's confusing you. These properties don't run any computation — they're metadata, instant to read.
Shapes can contain None for dynamic dimensions. This is common in model input specs where batch size or sequence length isn't fixed at graph build time. Inside model.summary() output, (None, 224, 224, 3) means: any batch size, 224×224 RGB image.
The .device property shows where the tensor lives — CPU vs GPU. Calling .numpy() on a GPU tensor implicitly copies it to CPU first, which is fine for occasional inspection but expensive in tight loops.