VAE kết quả tệ hơn AE

autoencoder

#1

Chào mọi người, em có thử tự code một model VAE cho tập dữ liệu MNIST lấy từ kaggle.

Theo em tìm hiểu thì VAE phù hợp cho dữ liệu kích thước lớn và bài toán generation, còn AE thì cho bài toán classification (https://stats.stackexchange.com/questions/324340/when-should-i-use-a-variational-autoencoder-as-opposed-to-an-autoencoder). Nhưng khi em thử code thì AE sinh ra kết quả tốt hơn VAE. Đối với VAE, ảnh reconstructed chỉ gồm những đốm trắng còn AE thì tuy bị nhòe những vẫn ra hình dạng của chữ số ban đầu.

Ví dụ, với AE:

  • Ảnh input:

image

  • Ảnh tạo lại:

image

Còn với VAE:

  • Ảnh tạo lại:

image

Em xin để lại code model của em:

class VAE(nn.Module):
    def __init__(self,input_shape=784,hidden_shape=512,latent_shape=64):
        super(VAE,self).__init__()
        self.fc1=nn.Linear(input_shape,512)
        self.fc2=nn.Linear(512,256)
        self.fc_mu=nn.Linear(256,latent_shape)
        self.fc_var=nn.Linear(256,latent_shape)
        self.fc4=nn.Linear(latent_shape,512)
        self.fc5=nn.Linear(512,784)
        self.softmax=nn.Softmax()
        self.relu=nn.ReLU()
        self.tanh=nn.Tanh()
        self.sigmoid=nn.Sigmoid()
        self.criterion=nn.BCELoss()

    def forward(self,x,n_sample=1):
        input=x
        x=self.fc1(x)
        x=self.sigmoid(x)
        x=self.fc2(x)
        x=self.sigmoid(x)
        mu=self.fc_mu(x)
        mu=self.relu(mu)
        log_var=self.fc_var(x)
        log_var=self.relu(log_var)
        rec_loss=0
        
        for i in range(n_sample):
            var=torch.exp(log_var)
            latent=mu+var*torch.zeros_like(mu).normal_()
            x=self.fc4(latent)
            x=self.relu(x)
            x=self.fc5(x)
            x=self.softmax(x)
            rec_loss+=self.criterion(x,input)
        
        rec_loss/=n_sample
        kl=-log_var+1/2*(var**2)+1/2*(mu**2)-1/2
        kl=kl.sum(-1).mean()
        elbo=rec_loss+kl

        return x,elbo

Không rõ em có nhầm lẫn chỗ nào không, mong được nghe nhận xét của mọi người ạ.


#2

VAE thì mờ hơn là bình thường, có gì đâu bạn :smiley: Nhưng bạn so sánh thế này thì hơi thiếu trực quan, khi reconstruction nên so sánh cùng một ảnh chứ.


#3

Em plot cùng một ảnh luôn á, nhưng hông hiểu sao bị mờ ạ.


#4

rõ là 2 hình quá khác nhau mà bạn @@ còn mờ là đúng rồi vì cái ở VEA có thể là sample hoặc là mean của cái distribution train ra, tùy vào cách bạn lấy, nên nó sẽ mờ