TensorFlow: Building Models with Keras
Sequential API
import tensorflow as tf
from tensorflow import keras
# Sequential — for simple linear stacks of layers
model = keras.Sequential([
keras.layers.Input(shape=(784,)),
keras.layers.Dense(256, activation='relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(10, activation='softmax'), # 10-class output
])
model.summary() # print layer shapes and param countsFunctional API
# Functional — for multi-input/output, residual connections, shared layers
inputs = keras.Input(shape=(224, 224, 3), name='image')
x = keras.layers.Conv2D(32, 3, activation='relu', padding='same')(inputs)
x = keras.layers.MaxPooling2D()(x)
x = keras.layers.Conv2D(64, 3, activation='relu', padding='same')(x)
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dense(256, activation='relu')(x)
x = keras.layers.Dropout(0.5)(x)
outputs = keras.layers.Dense(num_classes, activation='softmax')(x)
model = keras.Model(inputs, outputs, name='cnn')Compile & Train
# Compile: optimizer, loss, metrics
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-3),
loss='sparse_categorical_crossentropy', # int labels; use 'categorical_crossentropy' for one-hot
metrics=['accuracy'],
)
# Train
history = model.fit(
train_dataset,
epochs=50,
validation_data=val_dataset,
callbacks=[
keras.callbacks.EarlyStopping(patience=5, restore_best_weights=True),
keras.callbacks.ModelCheckpoint('best_model.keras', save_best_only=True),
keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=3),
keras.callbacks.TensorBoard(log_dir='logs/'),
]
)
# Evaluate and predict
loss, acc = model.evaluate(test_dataset)
predictions = model.predict(X_test) # shape: (n_samples, n_classes)
class_ids = predictions.argmax(axis=1)Common Layers
Dense: fully connected layer — most common for structured data
Conv2D: 2D convolution — images, spatial features
LSTM / GRU: recurrent layers — sequences, time-series, NLP
Embedding: maps integer IDs to dense vectors — word embeddings
BatchNormalization: normalize activations — faster training, better generalization
Dropout: randomly zero activations during training — regularization
GlobalAveragePooling2D: reduce spatial dims to single vector — replaces Flatten in CNNs
MultiHeadAttention: Transformer attention — NLP, vision transformers
Transfer Learning
# Load pretrained model (feature extractor)
base_model = keras.applications.EfficientNetV2B0(
include_top=False,
weights='imagenet',
input_shape=(224, 224, 3),
)
base_model.trainable = False # freeze — only train new head
# Add custom head
x = base_model.output
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dense(256, activation='relu')(x)
outputs = keras.layers.Dense(num_classes, activation='softmax')(x)
model = keras.Model(base_model.input, outputs)
# Phase 2: unfreeze top layers and fine-tune
base_model.trainable = True
for layer in base_model.layers[:-20]:
layer.trainable = False
model.compile(optimizer=keras.optimizers.Adam(1e-5), loss='...', metrics=[...])Keep your own version of these notes — editable, searchable, and organised by your stack.
Start free