Hi @ptrblck,  I am looking at this link here point # 2 but there is something I am missing,
model_ft = models.resnet18(pretrained=True)
num_ftrs = model_ft.fc.in_features
# Here the size of each output sample is set to 2.
# Alternatively, it can be generalized to nn.Linear(num_ftrs, len(class_names)).
model_ft.fc = nn.Linear(num_ftrs, 2)

Then you create another model…
model_conv = torchvision.models.resnet18(pretrained=True)
for param in model_conv.parameters():
    param.requires_grad = False

# Parameters of newly constructed modules have requires_grad=True by default
num_ftrs = model_conv.fc.in_features
model_conv.fc = nn.Linear(num_ftrs, 2)

they have different model names and in the first one, you use all the layers except the last linear one and set it to 2.
In the second piece of code, you freeze all layers and then the rest is basically the same.
BUT I don’t see any fine-tuning here… at least not from Keras way of doing it… where we use the same model and here are different models.
you mean we have to do this, or what is that I am missing
output = model_ft(x)
output = model2(model_conv)
loss = criterion(output, target)

Thanks a lot for your help!