Deep Learning (DL)
Work with neural networks for images, language, and complex pattern recognition.
Prerequisites
Basic understanding of Machine Learning is recommended before starting Deep Learning.
Certificate
Awarded by Rescue Academy on successful completion of the program's assessments and final project.
Learn Online β Live Classes
Register, receive your schedule, and join live instructor-led Deep Learning (DL) classes on Zoom. Assignments, instructor feedback, and a certificate on completion.
Learn In Person
Attend Deep Learning (DL) classes in person in Juba with hands-on labs, instructor mentorship, and a certificate on completion.
What You'll Learn
- Neural network basics: layers and activation
- Training intuition: loss, gradients, optimization
- Computer vision basics (images and CNN idea)
- Text basics (tokens and embeddings concept)
- Practical limits: data, compute, and responsible use
Curriculum
Beginner
Full lessons available belowModule 1: Introduction to Artificial Neural Networks (ANNs)
Learning objectives
- Understand how a neural network processes information
Lessons
- Neurons, Weights & Activations
- Forward Pass Basics
Module 2: Convolutional Neural Networks (CNNs) for Computer Vision
Learning objectives
- Understand how CNNs process images
Lessons
- Convolutions & Filters
- Building a Simple Image Classifier
Module 3: Recurrent Neural Networks (RNNs) for Sequence Data
Learning objectives
- Understand how RNNs handle sequential data
Lessons
- Sequence Data & RNN Basics
- Where RNNs Are Used
Module 4: Transfer Learning & Pre-trained Models
Learning objectives
- Reuse pre-trained models effectively
Lessons
- What is Transfer Learning?
- Fine-Tuning a Pre-trained Model
Module 5: Model Optimization: Loss Functions, Optimizers & Learning Rate
Learning objectives
- Tune training for better results
Lessons
- Loss Functions & Optimizers
- Learning Rate & Training Stability
Intermediate
Outline β full lessons coming soonModule 1: Deeper Architectures
Learning objectives
- Understand deeper and more complex network designs
Lessons
- Deeper CNN Architectures
- Residual Connections Basics
Module 2: Working with Real Image/Text Datasets
Learning objectives
- Prepare real-world data for deep learning
Lessons
- Data Augmentation
- Preparing Text Data for Models
Module 3: Training on Google Colab/GPUs
Learning objectives
- Use accelerated hardware for training
Lessons
- Using GPUs Effectively
- Managing Training Time & Resources
Module 4: Model Evaluation for Deep Learning
Learning objectives
- Evaluate deep learning models properly
Lessons
- Validation Strategies
- Diagnosing Under/Overfitting in DL
Module 5: Intermediate Project
Learning objectives
- Train a deep learning model on a real dataset
Lessons
- Planning a DL Project
- Train, Evaluate & Present
Advanced
Outline β full lessons coming soonModule 1: Advanced Architectures
Learning objectives
- Understand modern advanced architectures conceptually
Lessons
- Attention Mechanisms (Conceptual)
- Where Transformers Are Used
Module 2: Model Deployment for Deep Learning
Learning objectives
- Move a deep learning model toward production
Lessons
- Exporting & Serving DL Models
- Performance Considerations
Module 3: Responsible Deep Learning
Learning objectives
- Apply DL responsibly given its risks
Lessons
- Bias in Deep Learning Systems
- Compute Cost & Environmental Considerations
Module 4: Research-Style Experimentation
Learning objectives
- Run structured experiments like a practitioner
Lessons
- Structuring Experiments
- Reading & Applying a Research Idea
Module 5: Capstone Project
Learning objectives
- Build and present a complete deep learning solution
Lessons
- Planning the Capstone
- Train, Evaluate & Present
Full Lessons β Beginner Level
1. Introduction to Artificial Neural Networks (ANNs)
An Artificial Neural Network (ANN) is inspired by the human brain. It consists of layers of artificial neurons β an input layer, one or more hidden layers, and an output layer. Each connection between neurons has a weight and each neuron has a bias. As data flows through the network, an activation function (like ReLU or Sigmoid) decides whether a neuron should "fire," allowing the network to learn complex patterns.
- Input layer: receives raw data (e.g., pixel values, sensor readings).
- Hidden layers: extract increasingly abstract features β edges, shapes, objects.
- Weights & biases: adjusted during training to minimize error (this is "learning").
- Built and trained using PyTorch or TensorFlow/Keras in Google Colab or Jupyter Notebooks.
π‘ Practical Skill: Use Google Colab (free GPU!) to build your first ANN. No local setup needed β just a browser. Start with a simple classifier like predicting pass/fail from study hours.
Try it Yourself β ANN with Keras (TensorFlow)
# A minimal Artificial Neural Network using TensorFlow/Keras
# Run in Google Colab or install: pip install tensorflow
import tensorflow as tf
import numpy as np
# Simple dataset: predict score (0-100) from hours studied
hours = np.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=float)
scores = np.array([10, 25, 35, 48, 55, 68, 77, 90], dtype=float)
# Build a sequential ANN with 1 hidden layer
model = tf.keras.Sequential([
# Input layer (1 neuron for 1 feature) + Hidden layer (8 neurons, ReLU)
tf.keras.layers.Dense(8, activation='relu', input_shape=(1,)),
# Output layer (1 neuron for the score prediction)
tf.keras.layers.Dense(1)
])
# Compile: choose optimizer and loss function
model.compile(optimizer='adam', loss='mse')
# Train the network (epochs = passes over the data)
print("Training neural network...")
model.fit(hours, scores, epochs=300, verbose=0)
print("Training complete!")
# Predict: what score for 4.5 hours of study?
prediction = model.predict(np.array([4.5]), verbose=0)
print(f"Predicted score for 4.5 hours: {prediction[0][0]:.1f}%")
# Expected: around 55-65% (the network learned the pattern!)
2. Convolutional Neural Networks (CNNs) for Computer Vision
CNNs are specialized neural networks for image data. Instead of feeding raw pixels into a dense layer, CNNs use convolutional layers that slide small filters (kernels) across the image to detect features β edges, textures, shapes β at different scales. Pooling layers (like MaxPooling) downsample the image, keeping important features while reducing computation. This makes CNNs ideal for infrastructure inspection, flood mapping from satellite imagery, and medical image analysis.
Conv2Dlayer: applies learnable filters to detect visual patterns (edges, corners).MaxPool2Dlayer: reduces image size, makes the model robust to small shifts.- CNNs automatically learn hierarchical features β from simple edges to complex objects.
- Train on Google Colab with GPU acceleration; visualize filters with Matplotlib.
π‘ Practical Skill: Apply CNNs to satellite imagery for flood damage assessment or road condition monitoring in South Sudan. Use TensorFlow or PyTorch with Jupyter Notebooks to iterate quickly.
Try it Yourself β CNN Pipeline with Conv2D & MaxPool2D
# Building a CNN feature extractor using TensorFlow/Keras
# Shows how Conv2D and MaxPool2D layers work together
import tensorflow as tf
# Build a CNN pipeline (just the feature extraction part)
cnn_pipeline = tf.keras.Sequential([
# First Conv2D: 32 filters, each 3x3, looking for edges and textures
tf.keras.layers.Conv2D(
filters=32,
kernel_size=(3, 3),
activation='relu',
input_shape=(64, 64, 1)
),
# MaxPool2D: reduces size from 64x64 to 32x32, keeps strongest features
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
# Second Conv2D: 64 filters, detects more complex shapes
tf.keras.layers.Conv2D(
filters=64,
kernel_size=(3, 3),
activation='relu'
),
# MaxPool2D: reduces from 32x32 to 16x16
tf.keras.layers.MaxPool2D(pool_size=(2, 2)),
# Flatten: converts 2D feature maps into a 1D vector for the classifier
tf.keras.layers.Flatten(),
# Dense layer: makes the final decision (e.g., "flooded" vs "not flooded")
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# Print a summary of the architecture
cnn_pipeline.summary()
print("\n\u2705 CNN pipeline built! The model will automatically learn")
print(" to detect edges \u2192 shapes \u2192 objects from image data.")
3. Recurrent Neural Networks (RNNs) for Sequence Data
RNNs (Recurrent Neural Networks) are designed for sequential data β time series, text, audio, or sensor logs. Unlike regular neural networks, RNNs have a memory: they process inputs one step at a time and pass a "hidden state" from step to step. LSTMs (Long Short-Term Memory) are an advanced version that can remember information over long sequences, solving the "forgetting" problem of basic RNNs.
- RNN/LSTM input shape:
(batch_size, timesteps, features)β e.g., 30 days of 3 sensors. - LSTMs are used for weather forecasting, stock prediction, text generation, and speech recognition.
- In South Sudan, LSTM models could predict river levels from historical sensor data for early flood warnings.
- Use TensorFlow/Keras
LSTMlayer β simple to add to any model.
π‘ Practical Skill: Process time-series data from IoT sensors or weather stations. Clean the data in Jupyter Notebooks, structure it as sequences, and train an LSTM to make predictions.
Try it Yourself β LSTM for Sequence Prediction
# Setting up an LSTM model for time-series prediction
# Input: 10 timesteps, each with 1 feature (e.g., daily temperature)
import tensorflow as tf
# Define the LSTM model
model = tf.keras.Sequential([
# LSTM layer: 50 memory units, expecting sequences of 10 steps
# input_shape = (timesteps, features)
tf.keras.layers.LSTM(50, activation='tanh', input_shape=(10, 1)),
# Dense output layer: predict the next value
tf.keras.layers.Dense(1)
])
# Compile the model
model.compile(optimizer='adam', loss='mse')
print("\u2705 LSTM model ready for sequence data!")
print(f" Input shape: (batch_size, 10 timesteps, 1 feature)")
print(f" Output: 1 value (next step prediction)")
# Show model architecture
model.summary()
# Example: simulate how you'd reshape raw sensor data
# Raw data: [25, 26, 27, 26, 25, 24, 23, 24, 25, 26, 27, 28]
# Sequences of 10 steps => predict the 11th value
print("\nData shape hint: reshape raw sensor logs to")
print(" (num_sequences, 10, 1) before training.")
4. Transfer Learning & Pre-trained Models
Transfer learning is one of the most powerful techniques in deep learning. Instead of training a massive model from scratch (which requires millions of images and weeks of GPU time), you take a pre-trained model β like ResNet50, MobileNet, or EfficientNet β that was already trained on millions of images (ImageNet). You remove the classification head and add your own custom layers for your specific task. This works even with very little data.
- Pre-trained models have learned general visual features (edges, textures, shapes).
- You "freeze" the early layers (they already know how to see) and only train the new head.
- Perfect for custom tasks like detecting potholes, classifying crops, or mapping flooded areas.
- Available in
torchvision.models(PyTorch) andtf.keras.applications(TensorFlow).
π‘ Practical Skill: Fine-tune MobileNet for a custom dataset of South Sudanese infrastructure (roads, bridges, markets). Use Google Colab with a free GPU β training takes minutes, not days.
Try it Yourself β Load Pre-trained MobileNetV2 & Remove Head
# Loading a pre-trained MobileNetV2 and customizing it for a new task
# Install: pip install tensorflow
import tensorflow as tf
# Load MobileNetV2 pre-trained on ImageNet (1000 classes)
# We exclude the top (classification head) to add our own
base_model = tf.keras.applications.MobileNetV2(
input_shape=(224, 224, 3), # standard image size
include_top=False, # drop the classification head
weights='imagenet' # use pre-trained ImageNet weights
)
# Freeze the base model layers (they already know how to "see")
base_model.trainable = False
# Add our own custom classification head
model = tf.keras.Sequential([
base_model, # pre-trained feature extractor
tf.keras.layers.GlobalAveragePooling2D(), # reduce dimensions
tf.keras.layers.Dense(128, activation='relu'), # new learning layer
tf.keras.layers.Dropout(0.3), # prevent overfitting
tf.keras.layers.Dense(1, activation='sigmoid') # binary output (e.g., flooded/not flooded)
])
# Compile β only the new head layers will train
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
print("\u2705 Pre-trained MobileNetV2 loaded with custom head!")
print(f" Base model layers: {len(base_model.layers)} (frozen)")
print(f" New head: GlobalAvgPool \u2192 Dense(128) \u2192 Dropout \u2192 Dense(1)")
print("\nTrain with your own images:")
print(" model.fit(train_images, train_labels, epochs=10)")
print(" For fine-tuning later, set base_model.trainable = True")
5. Model Optimization: Loss Functions, Optimizers & Learning Rate
Training a deep learning model is an optimization problem. The loss function measures how wrong the model's predictions are. The optimizer (like Adam) adjusts the weights to minimize the loss. The learning rate controls how big each adjustment is β too high and the model jumps around; too low and it learns painfully slowly. Choosing the right combination is key to fast, accurate training.
- Loss functions:
CrossEntropyLossfor classification,MSELossfor regression. - Adam optimizer: adapts learning rates per-parameter β works well out of the box for most tasks.
- Learning rate schedulers: reduce the learning rate over time (e.g.,
ReduceLROnPlateau) for fine-grained convergence. - Monitor training with TensorBoard or simple accuracy/loss plots in Jupyter Notebooks.
π‘ Practical Skill: Start with Adam and a learning rate of 0.001. If the loss plateaus, use a scheduler to reduce the rate. Use Google Colab to experiment with different configurations quickly.
Try it Yourself β Loss Function & Optimizer Setup (PyTorch)
# Setting up loss function and optimizer in PyTorch
# Install: pip install torch
import torch
import torch.nn as nn
import torch.optim as optim
# --- Define a simple neural network ---
class SimpleNN(nn.Module):
def __init__(self):
super().__init__()
self.fc1 = nn.Linear(10, 32) # input: 10 features
self.fc2 = nn.Linear(32, 1) # output: 1 value
def forward(self, x):
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
model = SimpleNN()
# --- Step 1: Choose a loss function ---
# For binary classification (e.g., flooded / not flooded)
criterion = nn.BCEWithLogitsLoss()
# --- Step 2: Choose an optimizer ---
optimizer = optim.Adam(
model.parameters(),
lr=0.001 # learning rate: 0.001 is a great default for Adam
)
# --- Step 3: Optional learning rate scheduler ---
scheduler = optim.lr_scheduler.ReduceLROnPlateau(
optimizer,
mode='min', # reduce when loss stops decreasing
factor=0.5, # cut learning rate in half
patience=5 # wait 5 epochs before reducing
)
print("\u2705 Loss function: BCEWithLogitsLoss (binary classification)")
print("\u2705 Optimizer: Adam with lr=0.001")
print("\u2705 Scheduler: ReduceLROnPlateau (patience=5)")
# --- Simulate one training step ---
# Dummy data: batch of 8 samples, each with 10 features
inputs = torch.randn(8, 10) # random input
labels = torch.randint(0, 2, (8, 1)).float() # random labels (0 or 1)
# Forward pass
outputs = model(inputs)
loss = criterion(outputs, labels)
# Backward pass & optimization step
optimizer.zero_grad() # clear previous gradients
loss.backward() # compute gradients
optimizer.step() # update weights
print(f"\nSample training step completed!")
print(f" Loss: {loss.item():.4f} (should decrease over epochs)")
print(f" Learning rate: {optimizer.param_groups[0]['lr']}")
Quick Quiz β Deep Learning Basics
Tools & Technologies
- Python
- Google Colab
- Jupyter
- TensorFlow
- PyTorch
Career Opportunities
- Data/AI analyst role at a bank, telecom, or NGO
- Research or further-study pathway in AI/ML/Data Science
- Remote/freelance AI or data work
Practical Projects
- Train a CNN-based image classifier on a real dataset
- Fine-tune a pre-trained model for a new task using transfer learning