Denoising AutoEncoder(DAE, Multi-DAE)

2024. 2. 19. 13:49ML model/Generative Model

AutoEncoder 구조
Denoising AutoEncoder 구조

 

실제 데이터는 noise가 낀 데이터일 확률이 높다.

 

따라서 AutoEncoder에 비해 더욱 강건한 모델을 만들고자 input 데이터에 인위적인 noise를 추가하고, 모델이 해당 noise를 제거(denoising)하여 원래 input을 재건할 수 있도록 학습한다.

 

 

Denoising 방법으로는 두 가지가 있다.

1) Gaussian(정규 분포)로 부터 추출한 랜덤 값을 각 pixel에 더해주는 방법

2) Dropout을 이용하는 방법

 

**Denoising AutoEncoder는 input 단계에서 noise를 추가하는 것.

 

import torch.nn as nn
import torch.nn.functional as F
import torch
import numpy as np 

class DAE(nn.Module):
    """
    input : encoder_dims

        encoder = [n_items, dim1, dim2]
        decoder_dims = [dim2, dim1, n_items]
    """
    
    def __init__(self, config, encoder_dims, decoder_dims=None, dropout=0.5): 
        super(DAE, self).__init__()
        self.config = config
        self.encoder_dims = encoder_dims
        if decoder_dims:
            assert decoder_dims[0] == encoder_dims[-1], "In and Out dimensions must equal to each other"
            assert decoder_dims[-1] == encoder_dims[0], "Latent dimension for p- and q- network mismatches."
            self.decoder_dims = decoder_dims
        else:
            self.decoder_dims = encoder_dims[::-1]
            
        self.drop = nn.Dropout(dropout)
        self.encoder = self.build_layers(self.encoder_dims, config['activate_function'])
        self.decoder = self.build_layers(self.decoder_dims, config['activate_function'])
        

    def build_layers(self, dims, activate_function = 'ReLU'):
        """
        Helper function to build layers based on the provided dimensions.

        Parameters:
            - dims (list): List of dimensions for the layers.

        Returns:
            - nn.Sequential: Sequential container for the layers.
        """
        layers = []
        for i in range(1, len(dims)):
            layers.append(nn.Linear(dims[i-1], dims[i]))
            if i == len(dims)-1:
                pass
            else:
                if activate_function == 'ReLU':
                    layers.append(nn.ReLU())
                elif activate_function == 'Sigmoid':
                    layers.append(nn.Sigmoid())
                elif activate_function == 'Tanh':
                    layers.append(nn.Tanh())
                else:
                    pass

        return nn.Sequential(*layers)
    
    def add_noise(self, matrix):
        noise = torch.randn(matrix.shape) * 0.5
        matrix = matrix + noise
        return matrix
        
    def forward(self, input):
        if self.config['denoising'] == 'Dropout':
            h = F.normalize(input)
            h = self.drop(h)
            
        elif self.config['denoising'] == 'Gaussian':
            h = self.add_noise(input)
            h = F.normalize(h)

        h = self.encoder(h)
        h = self.decoder(h)
        
        return h
  
    def get_codes(self, x):
        return self.encoder(x)

'ML model > Generative Model' 카테고리의 다른 글

Variational AutoEncoder(VAE, Multi-VAE)  (0) 2024.02.21
AutoEncoder (for Recommend System)  (1) 2024.02.19