Bird
Raised Fist0
TensorFlowml~20 mins

Fine-tuning approach in TensorFlow - ML Experiment: Train & Evaluate

Choose your learning style10 modes available
Experiment - Fine-tuning approach
Problem:You want to classify images into 5 categories using a pre-trained model. Currently, you trained only the top layers, but the validation accuracy is low compared to training accuracy.
Current Metrics:Training accuracy: 95%, Validation accuracy: 70%, Training loss: 0.15, Validation loss: 0.85
Issue:The model is overfitting. It learns training data well but does not generalize to validation data.
Your Task
Reduce overfitting by fine-tuning some layers of the pre-trained model to improve validation accuracy to at least 80%, while keeping training accuracy below 90%.
You can only unfreeze and train layers of the pre-trained base model.
Do not change the dataset or batch size.
Keep the same optimizer and learning rate for fine-tuning.
Hint 1
Hint 2
Hint 3
Solution
TensorFlow
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import MobileNetV2

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

# Add new classification head
inputs = tf.keras.Input(shape=(128, 128, 3))
x = base_model(inputs, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.3)(x)  # Add dropout to reduce overfitting
outputs = layers.Dense(5, activation='softmax')(x)
model = models.Model(inputs, outputs)

# Compile and train only top layers first
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Assume train_ds and val_ds are predefined datasets
# model.fit(train_ds, epochs=5, validation_data=val_ds)

# Fine-tuning: unfreeze last 20 layers of base model
base_model.trainable = True
for layer in base_model.layers[:-20]:
    layer.trainable = False

# Compile with lower learning rate
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# Train with fine-tuning
# model.fit(train_ds, epochs=10, validation_data=val_ds)

# Note: Replace train_ds and val_ds with actual datasets when running.
Unfroze the last 20 layers of the pre-trained MobileNetV2 model to allow fine-tuning.
Added dropout layer with rate 0.3 before the classification layer to reduce overfitting.
Lowered the learning rate to 1e-5 during fine-tuning to avoid large weight updates.
Results Interpretation

Before fine-tuning: Training accuracy was 95%, validation accuracy was 70%, showing overfitting.

After fine-tuning: Training accuracy decreased to 88%, validation accuracy improved to 82%, and validation loss decreased, indicating better generalization.

Fine-tuning some layers of a pre-trained model with a lower learning rate and dropout helps reduce overfitting and improves validation accuracy.
Bonus Experiment
Try adding data augmentation to the training pipeline along with fine-tuning to see if validation accuracy improves further.
💡 Hint
Use layers like RandomFlip and RandomRotation from tensorflow.keras.layers to augment images during training.

Practice

(1/5)
1. What is the main purpose of fine-tuning a pretrained TensorFlow model?
easy
A. To adapt the model to a new task by training some layers
B. To train a model from scratch with random weights
C. To increase the size of the dataset automatically
D. To reduce the number of layers in the model

Solution

  1. Step 1: Understand fine-tuning concept

    Fine-tuning means adjusting a pretrained model to work well on a new task by training some of its layers.
  2. Step 2: Compare options

    Only To adapt the model to a new task by training some layers correctly describes this process. Other options describe unrelated tasks.
  3. Final Answer:

    To adapt the model to a new task by training some layers -> Option A
  4. Quick Check:

    Fine-tuning = adapt pretrained model [OK]
Hint: Fine-tuning means training some layers on new data [OK]
Common Mistakes:
  • Thinking fine-tuning means training from scratch
  • Confusing fine-tuning with data augmentation
  • Assuming fine-tuning reduces model size
2. Which TensorFlow code snippet correctly freezes the base model layers before fine-tuning?
easy
A. base_model.layers.freeze = True
B. base_model.trainable = False
C. base_model.freeze()
D. base_model.trainable = True

Solution

  1. Step 1: Recall TensorFlow syntax for freezing layers

    In TensorFlow, setting trainable = False freezes the layers.
  2. Step 2: Check options

    base_model.trainable = False uses correct syntax. Options A, B, and C are invalid methods/attributes or incorrect (e.g., trainable = True unfreezes layers).
  3. Final Answer:

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

    Freeze layers = trainable False [OK]
Hint: Freeze layers by setting trainable to False [OK]
Common Mistakes:
  • Using incorrect method names like freeze()
  • Setting trainable to True to freeze layers
  • Trying to freeze layers by modifying layer attributes directly
3. What will be the output shape of the model after adding a new Dense layer with 10 units on top of a base model output shape (None, 1280)?
base_model = tf.keras.applications.MobileNetV2(input_shape=(224,224,3), include_top=False, pooling='avg')
new_output = tf.keras.layers.Dense(10, activation='softmax')(base_model.output)
model = tf.keras.Model(inputs=base_model.input, outputs=new_output)
print(model.output_shape)
medium
A. (None, 128)
B. (None, 224, 224, 3)
C. (None, 10)
D. (10, None)

Solution

  1. Step 1: Understand base model output shape

    The base model outputs a tensor with shape (None, 1280) due to pooling='avg'.
  2. Step 2: Adding Dense layer changes output shape

    The Dense layer with 10 units changes output shape to (None, 10), where None is batch size.
  3. Final Answer:

    (None, 10) -> Option C
  4. Quick Check:

    Dense units = output shape last dim [OK]
Hint: Dense layer units define output shape's last dimension [OK]
Common Mistakes:
  • Confusing input shape with output shape
  • Ignoring batch size dimension None
  • Assuming output shape keeps base model shape
4. Identify the error in this fine-tuning code snippet:
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=5)

base_model.trainable = True
model.fit(train_data, epochs=5, learning_rate=0.001)
medium
A. Dense layer should be added before base_model
B. base_model.trainable should be True before first fit
C. Loss function is incorrect for classification
D. learning_rate is not a valid argument in model.fit

Solution

  1. Step 1: Check model.fit arguments

    The model.fit method does not accept learning_rate as an argument; it belongs to the optimizer.
  2. Step 2: Identify correct way to change learning rate

    To change learning rate, create a new optimizer with desired learning rate and recompile the model.
  3. Final Answer:

    learning_rate is not a valid argument in model.fit -> Option D
  4. Quick Check:

    learning_rate belongs to optimizer, not fit [OK]
Hint: learning_rate must be set in optimizer, not fit() [OK]
Common Mistakes:
  • Passing learning_rate to model.fit
  • Not recompiling model after changing trainable layers
  • Freezing layers after first training instead of before
5. You want to fine-tune a pretrained model on a small dataset. Which approach is best to avoid overfitting?
# Step 1: Freeze base model
base_model.trainable = False
# Step 2: Add new classifier layers
# Step 3: Train new layers
# Step 4: Unfreeze some base layers
# Step 5: Continue training with low learning rate

Which of these is the best practice for Step 5?
hard
A. Use a very low learning rate like 1e-5 to fine-tune base layers
B. Use a high learning rate like 0.1 to speed up training
C. Keep learning rate same as initial training
D. Stop training immediately after unfreezing layers

Solution

  1. Step 1: Understand fine-tuning with small data

    Fine-tuning with small data risks overfitting, so training must be gentle.
  2. Step 2: Choose learning rate carefully

    A very low learning rate (e.g., 1e-5) helps adjust pretrained weights slowly to avoid overfitting.
  3. Final Answer:

    Use a very low learning rate like 1e-5 to fine-tune base layers -> Option A
  4. Quick Check:

    Low learning rate prevents overfitting in fine-tuning [OK]
Hint: Use low learning rate when unfreezing pretrained layers [OK]
Common Mistakes:
  • Using high learning rate causing weight damage
  • Not unfreezing any layers for fine-tuning
  • Stopping training too early after unfreezing
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