Bird
Raised Fist0
PyTorchml~5 mins

Freezing layers in PyTorch

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
Freezing layers helps keep some parts of a model fixed so they don't change during training. This saves time and keeps learned knowledge safe.
When using a pre-trained model and you want to keep early layers unchanged.
When training a model on a small dataset to avoid overfitting.
When you want to speed up training by updating only some layers.
When transferring learning from one task to another similar task.
When experimenting with which parts of a model to train or keep fixed.
Syntax
PyTorch
for param in model.layer.parameters():
    param.requires_grad = False
Setting requires_grad to False tells PyTorch not to update these parameters during training.
You can freeze entire layers or just parts by selecting the right parameters.
Examples
Freeze all parameters in the first convolutional layer.
PyTorch
for param in model.conv1.parameters():
    param.requires_grad = False
Freeze all layers except those with 'fc' in their name (usually fully connected layers).
PyTorch
for name, param in model.named_parameters():
    if 'fc' not in name:
        param.requires_grad = False
Freeze the whole model except the final fully connected layer.
PyTorch
for param in model.parameters():
    param.requires_grad = False

for param in model.fc.parameters():
    param.requires_grad = True
Sample Model
This code creates a simple model with two layers. It freezes the first layer so it does not update during training. The optimizer only updates the second layer. After one training step, we print gradients to see which layers changed.
PyTorch
import torch
import torch.nn as nn
import torch.optim as optim

# Simple model with two linear layers
class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(5, 3)
        self.fc2 = nn.Linear(3, 1)
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

model = SimpleModel()

# Freeze first layer
for param in model.fc1.parameters():
    param.requires_grad = False

# Optimizer only updates parameters with requires_grad=True
optimizer = optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=0.1)

# Dummy data
inputs = torch.randn(4, 5)
targets = torch.randn(4, 1)

criterion = nn.MSELoss()

# Training step
model.train()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()

# Check which parameters were updated
fc1_grad = model.fc1.weight.grad
fc2_grad = model.fc2.weight.grad

print("fc1 weight grad:", fc1_grad)
print("fc2 weight grad:", fc2_grad)
OutputSuccess
Important Notes
Frozen layers do not get gradients, so their weights stay the same.
Always filter parameters with requires_grad=True when creating the optimizer.
You can unfreeze layers later by setting requires_grad back to True.
Summary
Freezing layers stops them from updating during training.
It is useful for transfer learning and saving training time.
Set requires_grad=False on parameters to freeze them.

Practice

(1/5)
1. What does freezing layers in a PyTorch model do during training?
easy
A. Removes the layers from the model
B. Increases the learning rate for those layers
C. Stops the layers' weights from updating
D. Duplicates the layers for faster training

Solution

  1. Step 1: Understand freezing layers meaning

    Freezing layers means preventing their weights from changing during training.
  2. Step 2: Effect on training

    When frozen, layers do not update weights, so they keep learned features intact.
  3. Final Answer:

    Stops the layers' weights from updating -> Option C
  4. Quick Check:

    Freezing = no weight updates [OK]
Hint: Freezing means no weight changes during training [OK]
Common Mistakes:
  • Thinking freezing increases learning rate
  • Believing freezing removes layers
  • Assuming freezing duplicates layers
2. Which of the following is the correct way to freeze all parameters in a PyTorch model named model?
easy
A. model.freeze()
B. for param in model.parameters(): param.requires_grad = False
C. model.requires_grad = False
D. for param in model.parameters(): param.grad = None

Solution

  1. Step 1: Identify correct syntax to freeze parameters

    Freezing requires setting requires_grad = False for each parameter.
  2. Step 2: Check each option

    for param in model.parameters(): param.requires_grad = False correctly loops over parameters and sets requires_grad = False. Others are invalid or incorrect.
  3. Final Answer:

    for param in model.parameters(): param.requires_grad = False -> Option B
  4. Quick Check:

    Set requires_grad False to freeze [OK]
Hint: Set requires_grad=False on each parameter to freeze [OK]
Common Mistakes:
  • Using model.requires_grad instead of param.requires_grad
  • Calling a non-existent freeze() method
  • Setting param.grad to None does not freeze
3. Consider this PyTorch code snippet:
import torch.nn as nn
model = nn.Sequential(
  nn.Linear(10, 5),
  nn.ReLU(),
  nn.Linear(5, 2)
)
for param in model[0].parameters():
  param.requires_grad = False

trainable_params = [p for p in model.parameters() if p.requires_grad]
print(len(trainable_params))

What will be printed?
medium
A. 2
B. 4
C. 6
D. 0

Solution

  1. Step 1: Analyze model layers and parameters

    model[0] is Linear(10,5) with 2 parameters (weight and bias). model[2] is Linear(5,2) with 2 parameters.
  2. Step 2: Check which parameters are trainable

    Parameters in model[0] are frozen (requires_grad=False), so only model[2]'s 2 parameters remain trainable.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    Frozen layer params excluded, trainable = 2 [OK]
Hint: Count only parameters with requires_grad=True [OK]
Common Mistakes:
  • Counting all parameters ignoring requires_grad
  • Assuming ReLU has parameters
  • Confusing layer indices
4. You want to freeze the first layer of a PyTorch model but accidentally wrote:
for param in model.layer1.parameters():
    param.grad = False

What is the problem with this code?
medium
A. param.grad is a tensor, not a boolean flag
B. param.grad disables gradients correctly
C. model.layer1.parameters() does not exist
D. param.requires_grad should be set, not param.grad

Solution

  1. Step 1: Understand difference between param.grad and param.requires_grad

    param.grad holds gradient values, it is a tensor or None, not a flag to enable/disable gradients.
  2. Step 2: Correct way to freeze parameters

    To freeze, set param.requires_grad = False. Setting param.grad = False is invalid and does not freeze.
  3. Final Answer:

    param.requires_grad should be set, not param.grad -> Option D
  4. Quick Check:

    Freeze by requires_grad=False, not param.grad [OK]
Hint: Freeze with requires_grad, not param.grad [OK]
Common Mistakes:
  • Confusing param.grad with requires_grad
  • Trying to disable gradients by setting param.grad
  • Assuming param.grad is a boolean
5. You have a pretrained PyTorch model with 3 layers: layer1, layer2, and layer3. You want to freeze layer1 and layer2 but train layer3. Which code correctly freezes only the first two layers?
hard
A. for layer in [model.layer1, model.layer2]: for param in layer.parameters(): param.requires_grad = False
B. for param in model.parameters(): param.requires_grad = False for param in model.layer3.parameters(): param.requires_grad = False
C. model.layer1.requires_grad = False model.layer2.requires_grad = False
D. model.freeze_layers(['layer1', 'layer2'])

Solution

  1. Step 1: Understand freezing multiple layers

    Freezing means setting requires_grad = False on each parameter in the layers to freeze.
  2. Step 2: Evaluate options

    for layer in [model.layer1, model.layer2]: for param in layer.parameters(): param.requires_grad = False correctly loops over layer1 and layer2 parameters and freezes them correctly. for param in model.parameters(): param.requires_grad = False for param in model.layer3.parameters(): param.requires_grad = False incorrectly freezes all parameters including layer3. model.layer1.requires_grad = False model.layer2.requires_grad = False tries to set requires_grad on layers (invalid). model.freeze_layers(['layer1', 'layer2']) calls a non-existent method.
  3. Final Answer:

    for layer in [model.layer1, model.layer2]: for param in layer.parameters(): param.requires_grad = False -> Option A
  4. Quick Check:

    Freeze layers by setting requires_grad False per parameter [OK]
Hint: Freeze layers by looping params and setting requires_grad False [OK]
Common Mistakes:
  • Setting requires_grad on layer objects instead of parameters
  • Using non-existent freeze_layers method
  • Freezing all parameters