I haven’t written an autoencoder using your structure and assume you are wondering which setup to use in the transposed convolutions?
If so, you could start by “inverting” the encoder path and use the inverse channel dimensions. The kernel size, stride etc. should most likely be set in a way to reproduce the input spatial size.
If you don’t want to calculate it manually, add Print layers to the model to check the output activation shape and adapt the setup:
class Print(nn.Module):
    def __init__(self):
        super(Print, self).__init__()
        
    def forward(self, x):
        print(x.shape)
        return x