https://towardsdatascience.com/variational-autoencoder-demystified-with-pytorch-implementation-3a06bee395ed