I made a simplified version of my code below. Here I added the model.eval() part as you suggested @ptrblck (or atleast I think this is how you suggested). However, I still don’t see the models being reproducible and I am wondering why that is? Is there something different I should add?
class Network(nn.Module):
    def __init__(self, input_size):
        # calling constructor of parent class
        super(Network, self).__init__()
        self.input_size = input_size
        model = []
        model += [
            nn.BatchNorm2d(1),
            nn.Conv2d(in_channels=1, out_channels=50, kernel_size=(5, 5), stride=1, padding=0),
            nn.ReLU(inplace=True),
            nn.BatchNorm2d(num_features=50),
            nn.Flatten()
        ]
        # Use this method or use lazyLinear (newer pytorch) that dont need in_features as input
        self.flat_size = self._infer_flat_size(model)
        model += [
            nn.Linear(in_features=self.flat_size, out_features=450),
            nn.ReLU(inplace=True),
            nn.Linear(in_features=450, out_features=10)
        ]
        self.model = nn.Sequential(*model)

    def _infer_flat_size(self, model):
        model = nn.Sequential(*model)
        model.eval()
        model_output = model(torch.ones(1, *self.input_size))
        return int(np.prod(model_output.size()[1:]))

    def forward(self, x):
        return self.model(x)