Bird
Raised Fist0
TensorFlowml~5 mins

Fine-tuning approach in TensorFlow

Choose your learning style10 modes available
Introduction

Fine-tuning helps a model learn new tasks faster by starting from a model already trained on similar data.

You want to teach a model to recognize new types of images but have limited data.
You want to improve a speech recognition model for a specific accent.
You want to adapt a language model to understand a special topic better.
You want to save time and computing power by not training from scratch.
Syntax
TensorFlow
base_model = tf.keras.applications.MobileNetV2(input_shape=(224,224,3), include_top=False, weights='imagenet')
base_model.trainable = False

# Add new layers on top
inputs = tf.keras.Input(shape=(224,224,3))
x = base_model(inputs, training=False)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
model = tf.keras.Model(inputs, outputs)

# Compile and train new layers
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_data, epochs=initial_epochs)

# Unfreeze some layers for fine-tuning
base_model.trainable = True
for layer in base_model.layers[: -fine_tune_at]:
    layer.trainable = False

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5),
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_data, epochs=fine_tune_epochs, initial_epoch=initial_epochs)

Start by freezing the base model to train only new layers.

Then unfreeze some layers to fine-tune with a low learning rate.

Examples
Load a pretrained ResNet50 model without the top layer and freeze it.
TensorFlow
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False)
base_model.trainable = False
Unfreeze the last 10 layers of the base model for fine-tuning.
TensorFlow
for layer in base_model.layers[-10:]:
    layer.trainable = True
Compile the model with a small learning rate for fine-tuning.
TensorFlow
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='categorical_crossentropy', metrics=['accuracy'])
Sample Model

This code shows how to fine-tune a pretrained MobileNetV2 model on new random data with 3 classes. It first trains only the new layers, then unfreezes part of the base model to fine-tune.

TensorFlow
import tensorflow as tf

# Load pretrained MobileNetV2 without top layers
base_model = tf.keras.applications.MobileNetV2(input_shape=(224,224,3), include_top=False, weights='imagenet')
base_model.trainable = False

# Number of classes for new task
num_classes = 3

# Build new model on top
inputs = tf.keras.Input(shape=(224,224,3))
x = base_model(inputs, training=False)
x = tf.keras.layers.GlobalAveragePooling2D()(x)
outputs = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
model = tf.keras.Model(inputs, outputs)

# Compile and train new layers
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

# Create dummy data: 100 samples of 224x224 RGB images and labels
import numpy as np
train_images = np.random.rand(100,224,224,3).astype('float32')
train_labels = np.random.randint(0, num_classes, 100)

initial_epochs = 2
model.fit(train_images, train_labels, epochs=initial_epochs)

# Unfreeze last 20 layers for fine-tuning
base_model.trainable = True
fine_tune_at = len(base_model.layers) - 20
for layer in base_model.layers[:fine_tune_at]:
    layer.trainable = False

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

fine_tune_epochs = 2
model.fit(train_images, train_labels, epochs=initial_epochs + fine_tune_epochs, initial_epoch=initial_epochs)
OutputSuccess
Important Notes

Fine-tuning works best when the new task is similar to the original task the model learned.

Use a smaller learning rate during fine-tuning to avoid big changes to pretrained weights.

Freezing too few layers may cause overfitting if data is small.

Summary

Fine-tuning adapts a pretrained model to a new task by training some layers.

Start by training new layers with the base model frozen.

Then unfreeze some base layers and train with a low learning rate.

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