Fine-tuning helps a model learn new tasks faster by starting from a model already trained on similar data.
Fine-tuning approach in 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.
base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False) base_model.trainable = False
for layer in base_model.layers[-10:]: layer.trainable = True
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='categorical_crossentropy', metrics=['accuracy'])
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.
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)
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.
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
Solution
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.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.Final Answer:
To adapt the model to a new task by training some layers -> Option AQuick Check:
Fine-tuning = adapt pretrained model [OK]
- Thinking fine-tuning means training from scratch
- Confusing fine-tuning with data augmentation
- Assuming fine-tuning reduces model size
Solution
Step 1: Recall TensorFlow syntax for freezing layers
In TensorFlow, settingtrainable = Falsefreezes the layers.Step 2: Check options
base_model.trainable = Falseuses correct syntax. Options A, B, and C are invalid methods/attributes or incorrect (e.g.,trainable = Trueunfreezes layers).Final Answer:
base_model.trainable = False -> Option BQuick Check:
Freeze layers = trainable False [OK]
- Using incorrect method names like freeze()
- Setting trainable to True to freeze layers
- Trying to freeze layers by modifying layer attributes directly
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)
Solution
Step 1: Understand base model output shape
The base model outputs a tensor with shape (None, 1280) due to pooling='avg'.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.Final Answer:
(None, 10) -> Option CQuick Check:
Dense units = output shape last dim [OK]
- Confusing input shape with output shape
- Ignoring batch size dimension None
- Assuming output shape keeps base model shape
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)Solution
Step 1: Check model.fit arguments
Themodel.fitmethod does not acceptlearning_rateas an argument; it belongs to the optimizer.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.Final Answer:
learning_rate is not a valid argument in model.fit -> Option DQuick Check:
learning_rate belongs to optimizer, not fit [OK]
- Passing learning_rate to model.fit
- Not recompiling model after changing trainable layers
- Freezing layers after first training instead of before
# 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?
Solution
Step 1: Understand fine-tuning with small data
Fine-tuning with small data risks overfitting, so training must be gentle.Step 2: Choose learning rate carefully
A very low learning rate (e.g., 1e-5) helps adjust pretrained weights slowly to avoid overfitting.Final Answer:
Use a very low learning rate like 1e-5 to fine-tune base layers -> Option AQuick Check:
Low learning rate prevents overfitting in fine-tuning [OK]
- Using high learning rate causing weight damage
- Not unfreezing any layers for fine-tuning
- Stopping training too early after unfreezing
Ready to prove it?
Pass the test and this pattern moves unknown
