You already know deep learning from PyTorch — this course maps it to Keras. Start with the two frameworks side by side, install TensorFlow, and meet tf.Tensor.
Why: you already understand tensors, autograd, layers, losses, and the training loop from the PyTorch course — Keras uses all the same ideas, so this course only teaches the DIFFERENCES, not the fundamentals again. When: read it as a translation guide; each lesson shows "the PyTorch thing you know → the Keras way." Where: the biggest difference is that Keras hides the training loop behind fit(), where PyTorch makes you write it — a convenience-vs-control trade.
You know (PyTorch) Keras equivalent (this course)
---------------------------- ------------------------------
torch.Tensor tf.Tensor
nn.Module / nn.Sequential keras.Model / keras.Sequential
the manual training loop model.compile() + model.fit()
Dataset / DataLoader tf.data.Dataset
torch.save / load_state_dict model.save / keras.models.load_model
hooks / manual logging Keras Callbacks
Same math. This course only covers what's DIFFERENT.Why: TensorFlow bundles Keras (as keras / tf.keras), and like PyTorch it uses the GPU automatically when one is available — no manual .to(device) needed. When: install once; the same code runs on CPU or GPU. Where: unlike PyTorch, TensorFlow places tensors and ops on the GPU by default, so you rarely manage devices by hand.
pip install tensorflow # includes Keras (as keras / tf.keras)
# Verify the install and whether a GPU is visible:
python -c "import tensorflow as tf; print(tf.__version__, tf.config.list_physical_devices('GPU'))"Why: a tf.Tensor is the same idea as a torch.Tensor — an N-dimensional array with a shape and dtype that runs on the GPU — and TensorFlow runs "eagerly" by default just like PyTorch, so operations execute immediately. When: create and manipulate tensors almost identically; the main difference is TensorFlow tensors are immutable (use tf.Variable for trainable state). Where: conversions to and from NumPy work the same, so your data-prep code carries over unchanged.
import tensorflow as tf
x = tf.constant([[1.0, 2.0], [3.0, 4.0]]) # like torch.tensor(...)
print(x.shape, x.dtype) # (2, 2) float32
print(x @ x) # matmul, same as PyTorch
print(tf.reduce_sum(x), tf.reduce_mean(x)) # tf.reduce_* vs x.sum()/x.mean()
print(x.numpy()) # -> NumPy, like .detach().cpu().numpy()
# tf.Tensors are immutable; trainable state uses tf.Variable (Keras handles this).