I think this should be easier with hooks. Why do you think it doesn’t fit your purpose?
activation = {}
def get_activation(name):
    def hook(model, input, output):
        activation[name] = output
    return hook


model = Bottleneck(3, 3)
model.shortcut.register_forward_hook(get_activation('bottleneck1'))
x = torch.randn(1, 3, 224, 224)
output = model(x)
print(activation['bottleneck1'])

loss = torch.norm(activation['bottleneck1'])