"""Freezing mechanics with hand-set features, NOT pretrained transfer evidence."""
import torch
from torch import nn
torch.manual_seed(8)
extractor=nn.Sequential(nn.Linear(2,2),nn.ReLU(),nn.Dropout(.4))
with torch.no_grad():
extractor[0].weight.copy_(torch.eye(2))
extractor[0].bias.zero_()
for p in extractor.parameters():p.requires_grad_(False)
head=nn.Linear(2,1)
extractor.eval() # freezing parameters alone does not disable dropout
head.train()
optimizer=torch.optim.SGD(head.parameters(),lr=.1)
x=torch.tensor([[1.,0.],[0.,1.],[1.,1.]])
y=torch.tensor([[1.],[0.],[1.]])
before_features={k:v.clone() for k,v in extractor.state_dict().items()}
before_head=head.weight.detach().clone()
optimizer.zero_grad()
with torch.no_grad():features=extractor(x)
loss=nn.functional.binary_cross_entropy_with_logits(head(features),y)
loss.backward();optimizer.step()
assert all(torch.equal(v,before_features[k]) for k,v in extractor.state_dict().items())
assert not torch.equal(head.weight,before_head)
assert not extractor.training and head.training
print('Extractor unchanged; head updated. No pretrained model was used.')