The current model should work as you’ve described in the sketch, i.e. both cropped inputs will be passed through the head layer, concatenated afterwards and passed through the rest of the model.
If you would like to visualize the cropped and concatenated feature maps, you could add them to the return statement:
def forward(self, x_up, x_down, return_features=False):
    x_up = self.head(x_up)
    x_down = self.head(x_down)
    x_cat = torch.cat((x_up, x_down), dim=2)
        
    x = self.features(x_cat)
    x = x.view(x.size(0), -1)
    x = self.classifier(x)
    if return_features:
        return x, x_up, x_down, x_cat
    else:
        return x

Now you could just use return_features=True, which will give you the intermediate activations:
output, act_up, act_down, act_concat = model(x_up, x_down, return_features=True)