I want to extract features from the penultimate layer in ResNet18 in PyTorch. I have seen some posts in this discussion forum, suggesting to use hooks to get the output. But I am not sure if I fully understand how it works and will it work if I want to back-propagate gradients.
Is there any alternative away to do that like in Tensorflow “model.get_layer(layer_name).output”?
I tried using the code below to get the output from the penultimate layer
rn18 = models.resnet18(pretrained=True)
Getting the name of the modules
cnames = []
for n,c in rn18.named_children():
    cnames += [n]

cnames = cnmaes[:-1]

Then I tried building a new net using the modules
new_net = nn.Sequential(nn.ModuleList([rn18._modules[n] for n in cnames]))
But when I tried to get a summary of the model
summary(new_net,(3,224,224))
I am getting an error
TypeError: forward() takes 1 positional argument but 2 were given
EDIT: Problem Solved
rn18._modules is an OrderedDict
So, popping the layers which are not required from the dict (like, rn18._modules.pop('fc')) and then doing
nn.Sequential(rn18._modules) does the job. I get the output from the penultimate layer of the pretrained network.
I think the issue was that I was giving nn.ModuleList as input to the nn.Sequential, whereas giving an OrderedDict as input worked fine.
This also works
        self.children_list = []
        for n,c in self.pretrained.named_children():
            if n != self.output_layer:
                self.children_list.append(c)
            else:
                self.children_list.append(c)
                break
        self.net = nn.Sequential(*self.children_list)
        self.pretrained = None