I tried some little more debugging, now input_image.grad returns a [1, 3, 224, 224] tensor as expected and does not throw an error about the input not having grads, however  self.gradients.data is still [1, 64, 224, 224].
    def hook_layers(self):
        def hook_function(module, grad_in, grad_out):
            self.gradients = grad_in[0]
        first_layer = list(self.model.features_1._modules.items())[0][1][0]
        first_layer.register_backward_hook(hook_function)

This is how I am hooking into the layers, as you can see the hook is at the first layer itself, so ideally speaking the shape flowing into the first layer should be equal to [1, 3, 224, 224] and not [1, 64, 224, 224] right?