That would be one possible method.
If you need a certain activation a lot of times, it could be easier to just return it in your forward:
def forward(self, x, ret_act=False):
    x = F.relu(self.conv1(x))
    a = F.relu(self.conv2(x))
    x = F.relu(self.conv3(a))
    if ret_act:
        return x, a
    else:
        return x

If you just want the activation, you could also wrap all layers up to the particular layer in an nn.Sequential module and just call it, but you won’t get the last output using this method.
Based on your last suggestion, you could also try to simulate the forward pass, but I’m not a huge fan of this approach:
output = model.conv3(F.relu(model.conv2(F.relu(model.conv1(x)))))