TensorFlow
02 / 04

Building & Training Models with Keras

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 counts

Functional 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