Bird
Raised Fist0
TensorFlowml~20 mins

Transfer learning for small datasets in TensorFlow - ML Experiment: Train & Evaluate

Choose your learning style10 modes available
Experiment - Transfer learning for small datasets
Problem:You want to classify images into 3 categories using a small dataset of 300 images. The current model is a simple CNN trained from scratch.
Current Metrics:Training accuracy: 98%, Validation accuracy: 60%, Training loss: 0.05, Validation loss: 1.2
Issue:The model overfits badly: training accuracy is very high but validation accuracy is low, indicating poor generalization.
Your Task
Use transfer learning with a pre-trained model to improve validation accuracy to above 85% while reducing overfitting.
You must use TensorFlow and Keras.
You cannot increase the dataset size.
You should freeze the pre-trained layers initially.
You can add dropout or data augmentation.
Hint 1
Hint 2
Hint 3
Hint 4
Hint 5
Solution
TensorFlow
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import MobileNetV2
from tensorflow.keras.preprocessing.image import ImageDataGenerator

# Load pre-trained MobileNetV2 without top layers
base_model = MobileNetV2(input_shape=(128,128,3), include_top=False, weights='imagenet')
base_model.trainable = False

# Add classification head
model = models.Sequential([
    base_model,
    layers.GlobalAveragePooling2D(),
    layers.Dropout(0.3),
    layers.Dense(3, activation='softmax')
])

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

# Data augmentation
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    validation_split=0.2
)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(128,128),
    batch_size=32,
    class_mode='sparse',
    subset='training'
)

validation_generator = train_datagen.flow_from_directory(
    'data/train',
    target_size=(128,128),
    batch_size=32,
    class_mode='sparse',
    subset='validation'
)

history = model.fit(
    train_generator,
    epochs=15,
    validation_data=validation_generator
)

# Optionally unfreeze some layers and fine-tune
base_model.trainable = True
fine_tune_at = 100
for layer in base_model.layers[:fine_tune_at]:
    layer.trainable = False

model.compile(optimizer=tf.keras.optimizers.Adam(1e-5),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

fine_tune_history = model.fit(
    train_generator,
    epochs=10,
    validation_data=validation_generator
)
Replaced simple CNN with MobileNetV2 pre-trained on ImageNet.
Froze base model layers to prevent overfitting on small data.
Added dropout layer to reduce overfitting.
Used data augmentation to increase effective dataset size.
Fine-tuned top layers of base model with low learning rate.
Results Interpretation

Before: Training accuracy 98%, Validation accuracy 60%, high overfitting.

After: Training accuracy 90%, Validation accuracy 87%, much better generalization.

Transfer learning with a pre-trained model and freezing layers helps prevent overfitting on small datasets. Data augmentation and dropout further improve validation accuracy.
Bonus Experiment
Try using a different pre-trained model like ResNet50 and compare validation accuracy.
💡 Hint
ResNet50 has a different architecture and may perform better or worse depending on your data. Adjust dropout and learning rate accordingly.

Practice

(1/5)
1. What is the main reason to use transfer learning when working with small datasets in TensorFlow?
easy
A. To increase the size of the dataset automatically
B. To use a pretrained model's knowledge and avoid training from scratch
C. To reduce the number of layers in the model
D. To train all layers of a model from random weights

Solution

  1. Step 1: Understand transfer learning purpose

    Transfer learning uses a pretrained model to leverage learned features from large datasets.
  2. Step 2: Relate to small dataset challenges

    Small datasets lack enough data to train deep models well, so using pretrained knowledge helps.
  3. Final Answer:

    To use a pretrained model's knowledge and avoid training from scratch -> Option B
  4. Quick Check:

    Transfer learning = pretrained knowledge reuse [OK]
Hint: Transfer learning reuses pretrained features for small data [OK]
Common Mistakes:
  • Thinking transfer learning increases dataset size
  • Believing all layers must be retrained
  • Assuming transfer learning reduces model layers
2. Which TensorFlow code snippet correctly freezes the base model layers for transfer learning?
easy
A. base_model.freeze_layers()
B. base_model.trainable = True
C. base_model.trainable = False
D. base_model.layers.freeze()

Solution

  1. Step 1: Recall how to freeze layers in TensorFlow

    Setting trainable = False on the base model freezes all its layers.
  2. Step 2: Check code options

    Only base_model.trainable = False is valid TensorFlow syntax to freeze layers.
  3. Final Answer:

    base_model.trainable = False -> Option C
  4. Quick Check:

    Freeze layers = trainable False [OK]
Hint: Set base_model.trainable = False to freeze layers [OK]
Common Mistakes:
  • Using trainable = True instead of False
  • Calling non-existent freeze_layers() method
  • Trying to freeze layers with base_model.layers.freeze()
3. Given this code snippet, what will be the output shape of the model's predictions?
import tensorflow as tf
base_model = tf.keras.applications.MobileNetV2(input_shape=(128,128,3), include_top=False, pooling='avg')
base_model.trainable = False
model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Dense(10, activation='softmax')
])
model.build((None, 128, 128, 3))
predictions = model(tf.random.uniform((5, 128, 128, 3)))
print(predictions.shape)
medium
A. (5, 1)
B. (5, 128, 128, 3)
C. (5, 1000)
D. (5, 10)

Solution

  1. Step 1: Analyze model architecture

    MobileNetV2 outputs pooled features (shape: (None, 1280)) due to pooling='avg'. Then Dense(10) outputs 10 classes.
  2. Step 2: Check input batch size and output shape

    Input batch size is 5, so output shape is (5, 10) from Dense layer.
  3. Final Answer:

    (5, 10) -> Option D
  4. Quick Check:

    Batch 5, 10 classes output shape = (5, 10) [OK]
Hint: Output shape matches batch size and last Dense units [OK]
Common Mistakes:
  • Confusing input shape with output shape
  • Expecting output shape to match input image shape
  • Assuming output has 1000 classes from original MobileNet
4. You wrote this code but get an error when training:
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False)
base_model.trainable = False
model = tf.keras.Sequential([
  base_model,
  tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(train_data, epochs=3)

What is the likely cause of the error?
medium
A. Missing input shape in base_model causing shape mismatch
B. trainable should be True to train the model
C. Loss function is incorrect for classification
D. Dense layer should have no activation

Solution

  1. Step 1: Check base_model input shape requirement

    ResNet50 requires input_shape when include_top=False to build properly.
  2. Step 2: Identify error cause

    Without input_shape, model layers don't connect correctly, causing training errors.
  3. Final Answer:

    Missing input shape in base_model causing shape mismatch -> Option A
  4. Quick Check:

    Input shape needed for base_model [OK]
Hint: Always specify input_shape when include_top=False [OK]
Common Mistakes:
  • Not specifying input_shape for pretrained base model
  • Thinking trainable must be True to avoid errors
  • Changing loss function unnecessarily
5. You have a small dataset of 200 images for a 3-class classification task. Which transfer learning approach is best to get good accuracy quickly?
hard
A. Use a pretrained model, freeze base layers, add new Dense layers, train only new layers
B. Train a new model from scratch with random weights
C. Use a pretrained model and train all layers without freezing
D. Use a pretrained model without adding new layers and train only base layers

Solution

  1. Step 1: Consider dataset size and training time

    Small dataset (200 images) benefits from freezing pretrained base to avoid overfitting and long training.
  2. Step 2: Choose transfer learning strategy

    Freezing base layers and training new Dense layers adapts model to new task efficiently.
  3. Final Answer:

    Use a pretrained model, freeze base layers, add new Dense layers, train only new layers -> Option A
  4. Quick Check:

    Freeze base + train new layers = best for small data [OK]
Hint: Freeze base layers, train new layers for small datasets [OK]
Common Mistakes:
  • Training all layers on small data causing overfitting
  • Training from scratch wasting time and data
  • Not adding new layers for the specific task
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard