Skip to content

Deep Learning Basics — Neural Networks Explained

DodaTech Updated 2026-06-20 8 min read

In this tutorial, you'll learn about Deep Learning Basics. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.

Deep Learning is a subset of Machine Learning that uses multi-layered neural networks to learn hierarchical representations from data, enabling breakthroughs in image recognition, natural language processing, and speech synthesis.

What You'll Learn

You'll understand how neural networks work — from individual neurons to multi-layer architectures — learn about activation functions and backpropagation, and build a real image classifier using TensorFlow and Keras.

Why It Matters

Deep Learning powers the most impressive AI achievements of the last decade — self-driving cars detecting pedestrians, ChatGPT holding conversations, medical AI diagnosing cancer from scans, and tools like Durga Antivirus Pro identifying never-before-seen malware.

Real-World Use

When you upload a photo to Facebook and it automatically tags your friends, a deep neural network has analyzed the image, detected faces, extracted facial features, and matched them against known profiles — all in under a second.

What Is a Neural Network?

A neural network is inspired by the human brain. Your brain has billions of neurons connected by synapses. A neural network has artificial neurons (called nodes) connected by weights.

flowchart LR
  subgraph Input Layer
    I1((x1))
    I2((x2))
    I3((x3))
  end
  subgraph Hidden Layer
    H1((h1))
    H2((h2))
  end
  subgraph Output Layer
    O1((y))
  end
  I1 --> H1
  I1 --> H2
  I2 --> H1
  I2 --> H2
  I3 --> H1
  I3 --> H2
  H1 --> O1
  H2 --> O1

Each connection has a weight that gets adjusted during training. Each neuron applies an activation function to determine whether to fire. Stack multiple layers, and you get a deep neural network.

How a Single Neuron Works

# A single artificial neuron
import numpy as np

def neuron(inputs, weights, bias):
    # Weighted sum
    z = np.dot(inputs, weights) + bias
    # Activation function (sigmoid)
    output = 1 / (1 + np.exp(-z))
    return output

# Example: decide whether to watch a movie
# Features: [has_free_time, is_good_genre, friend_recommended]
inputs = np.array([1, 0, 1])  # Yes, No, Yes
weights = np.array([0.5, 0.3, 0.8])
bias = -0.2

decision = neuron(inputs, weights, bias)
print(f"Watch movie? {decision:.2%} confident")

# Stronger preference: all three are yes
inputs2 = np.array([1, 1, 1])
decision2 = neuron(inputs2, weights, bias)
print(f"All conditions met? {decision2:.2%} confident")

Expected output:

Watch movie? 75.08% confident
All conditions met? 83.46% confident

A single neuron is just a weighted sum passed through an activation function. The magic happens when you connect thousands — or millions — of these neurons in layers.

Activation Functions

Activation functions introduce non-linearity, which lets neural networks learn complex patterns.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-5, 5, 100)

# Sigmoid: smooth S-curve, outputs 0 to 1
sigmoid = 1 / (1 + np.exp(-x))

# ReLU: max(0, x), most popular for hidden layers
relu = np.maximum(0, x)

# Tanh: S-curve, outputs -1 to 1
tanh = np.tanh(x)

# Demonstrate on a sample value
sample = np.array([-3, -1, 0, 1, 3])
print(f"Input:          {sample}")
print(f"Sigmoid:        {np.round(1/(1+np.exp(-sample)), 3)}")
print(f"ReLU:           {np.round(np.maximum(0, sample), 3)}")
print(f"Tanh:           {np.round(np.tanh(sample), 3)}")

Expected output:

Input:          [-3 -1  0  1  3]
Sigmoid:        [0.047 0.269 0.5 0.731 0.953]
ReLU:           [0 0 0 1 3]
Tanh:           [-0.995 -0.762 0. 0.762 0.995]

Why ReLU? It's fast to compute, doesn't saturate for positive values (unlike sigmoid), and helps solve the vanishing gradient problem. It's the default choice for hidden layers in most modern networks.

Building a Deep Neural Network

Let's build a real network to classify handwritten digits from the MNIST dataset.

import tensorflow as tf
from tensorflow import keras

# Load MNIST dataset
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# Normalize pixel values from 0-255 to 0-1
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0

# Flatten 28x28 images to 784-dimensional vectors
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)

# Build the model
model = keras.Sequential([
    keras.layers.Dense(128, activation="relu"),
    keras.layers.Dense(64, activation="relu"),
    keras.layers.Dense(10, activation="softmax"),
])

model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"],
)

# Train the model
history = model.fit(
    x_train, y_train,
    batch_size=32,
    epochs=5,
    validation_split=0.1,
    verbose=1,
)

# Evaluate
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f"Test accuracy: {test_acc:.2%}")

Expected output:

Epoch 1/5
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 3s 1ms/step - accuracy: 0.88
Epoch 2/5
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.96
Epoch 3/5
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.97
Epoch 4/5
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.98
Epoch 5/5
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step - accuracy: 0.98
Test accuracy: 97.50%

In just 5 epochs, our network achieves 97.5% accuracy on recognizing handwritten digits — without any feature engineering. The network learned its own features from the raw pixel data.

Making Predictions

# Make predictions on test samples
predictions = model.predict(x_test[:5], verbose=0)
predicted_digits = predictions.argmax(axis=1)

print("First 5 test samples:")
for i in range(5):
    confidence = predictions[i][predicted_digits[i]]
    print(f"  Predicted: {predicted_digits[i]} (confidence: {confidence:.2%})")
    print(f"  Actual digit: {y_test[i]}")
    print()

Expected output:

First 5 test samples:
  Predicted: 7 (confidence: 99.99%)
  Actual digit: 7

  Predicted: 2 (confidence: 99.98%)
  Actual digit: 2

  Predicted: 1 (confidence: 100.00%)
  Actual digit: 1

  Predicted: 0 (confidence: 100.00%)
  Actual digit: 0

  Predicted: 4 (confidence: 99.99%)
  Actual digit: 4

Learning Path: Where Deep Learning Fits

flowchart LR
  A[AI Overview] --> B[Machine Learning]
  B --> C[Deep Learning]
  C --> D[Computer Vision]
  C --> E[NLP]
  C --> F[Generative AI]
  C --> G[AI Security]
  D --> H[CNNs]
  E --> I[Transformers]
  F --> J["GANs / Diffusion"]
  G --> K[Adversarial ML]

Common Errors Beginners Make

1. Using Too Many Layers

Deeper isn't always better. Start with 1-2 hidden layers. Add more only if you have lots of data and the shallow network underfits.

2. Ignoring Data Normalization

Neural networks expect inputs in a consistent range (usually 0-1 or -1 to 1). Feeding raw pixel values (0-255) or unnormalized features causes training instability.

3. Training Too Few or Too Many Epochs

Too few = underfitting. Too many = overfitting. Use validation loss to stop at the right time. The Keras EarlyStopping callback automates this.

4. Forgetting Softmax for Multi-Class

The output layer of a multi-class classifier must use softmax activation to produce probabilities that sum to 1. Using sigmoid gives independent probabilities per class, which is wrong for single-label classification.

5. Overlooking the GPU

Training on CPU for large datasets is painfully slow. Use Google Colab's free GPU or set up TensorFlow with CUDA.

6. Not Using Batch Normalization

For deep networks, batch normalization stabilizes training and allows higher learning rates. Add BatchNormalization layers between dense layers and activations.

7. Expecting Neural Networks to Work on Tiny Data

Neural networks are data-hungry. With fewer than 1,000 samples per class, traditional ML (Random Forest, SVM) often outperforms Deep Learning.

Practice Questions

  1. What is a neural network activation function and why is it needed? An activation function introduces non-linearity, allowing the network to learn complex patterns. Without it, the network would just be a linear transformation regardless of depth.

  2. What's the difference between a shallow and deep neural network? A shallow network has one hidden layer. A deep network has multiple hidden layers, enabling hierarchical feature learning.

  3. Why is ReLU preferred over sigmoid for hidden layers? ReLU is faster, doesn't saturate for positive values, and helps prevent the vanishing gradient problem that plagues sigmoid in deep networks.

  4. What does the softmax activation do? Softmax converts raw output scores into probabilities that sum to 1, making it suitable for multi-class classification problems.

  5. What is backpropagation? Backpropagation is the algorithm that computes gradients of the loss with respect to each weight, allowing the network to learn by adjusting weights in the direction that reduces error.

Challenge

Modify the MNIST classifier above to use 3 hidden layers with different neuron counts (256, 128, 64). Add dropout layers after each dense layer. Train for 10 epochs with EarlyStopping. Does the accuracy improve? Does it converge faster?

Real-World Task

Collect 20 images of handwritten digits (your own writing). Resize them to 28x28, normalize them, and run them through the trained model. How many does it get right? Which digits confuse it? Use the model's confidence scores to identify its weakest areas.

FAQ

What is the difference between machine learning and deep learning?

Machine Learning includes many algorithms (decision trees, SVMs, etc.) that work on structured features. Deep Learning uses neural networks with many layers to learn features automatically from raw data. Deep Learning excels at unstructured data like images, audio, and text.

{{< faq "How much data do you need for Deep Learning?">}} It depends on the task. For image classification, you typically need at least 1,000 images per class. For complex tasks like language modeling, millions of examples are common. Transfer learning (using a pretrained model) dramatically reduces data requirements. {{< /faq >}}

Can deep learning be used for malware detection?

Yes — and it's highly effective. Durga Antivirus Pro uses deep neural networks to analyze file behavior patterns, detecting novel malware variants by identifying malicious behavioral signatures that traditional signature-based scanners would miss.

What's Next

Now that you understand neural network fundamentals, explore these advanced topics:

Computer Vision Guide
NLP Guide
Keras Deep Dive

Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro