@Takumi3 The monte carlo sounds interesting. Can you share a link of the paper/blog etc
In your code, I can see an issue here
In the predict function
samples_ = []
for i in range(samples):
    pred = self.forward(x1, x2).detach()
    samples_ += pred

Although you are iterating over a range of 100,  you are performing the forward on x1,x2 without updating the weights. This will give you the same results for all the 100 iterations. You need to perform some weight updation like .step() etc