2023-06-30,   김혜원

본 포스팅은 DCGAN에 대한 내용입니다.


 

DCGAN 이란?

 

DCGAN(Deep Convolution Generative Adversarial Network)은 Convlution layer로 이루어진 생성기와 이 생성기와 반대로 구성된 판별기가 있습니다[1]. 합성곱을 기반으로 연산이 이루어지기 때문에 데이터의 형태를 보존할 수 있고, 그로 인해 그럴듯한 이미지를 만들 수 있습니다. 이 모델은 합성곱을 사용함으로써 생성 모델의 큰 단점이었던 mode collepse(모델이 학습을 못 하는 상태)를 개선 했습니다. 아래는 논문에 나온 이미지 생성 예시입니다. 입력으로 선글라스를 낀 남자의 사진, 선글라스를 끼지 않은 남자의 사진, 선글라스를 끼지 않은 여자의 사진을 넣으면 모델이 각 이미지의 특징을 학습하여 선글라스를 낀 여자의 사진을 생성합니다[2].

 

example

 

구조

 

모델의 구조는 아래 그림에서 확인할 수 있습니다. 입력값은 정규분포에서 추출한 잠재공간 벡터 z이고, 생성기에서는 점점 채널 수를 줄여 필요한 정보만 남도록 하고, 마지막 블럭(3채널)을 통과하여 만들어진 이미지를 판별기에 넣습니다. 판별기가 정확하게 가짜를 분류할수록 생성기는 더 진짜 같은 이미지를 만들 것이고, 판별기와 생성기가 경쟁을 하며 학습을 합니다. 판별기의 마지막 층에서 시그모이드 함수를 사용하여 0~1 사이의 확률 값으로 조정합니다. 이 값이 0.5 이상이면 진짜, 미만이면 가짜로 분류합니다.

 

DCGAN_structure

 

모델 구현 예

 

하기 코드는 Pytorch에서 제공하는 튜토리얼의 모델 부분입니다[3].

 

<생성기>
class Generator(nn.Module):
def __init__(self, ngpu):
    super(Generator, self).__init__()
    self.ngpu = ngpu
    self.main = nn.Sequential(
       
        nn.ConvTranspose2d( nz, ngf * 8, 4, 1, 0, bias=False),
        nn.BatchNorm2d(ngf * 8),
        nn.ReLU(True),
        
        nn.ConvTranspose2d(ngf * 8, ngf * 4, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ngf * 4),
        nn.ReLU(True),
        
        nn.ConvTranspose2d( ngf * 4, ngf * 2, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ngf * 2),
        nn.ReLU(True),
       
        nn.ConvTranspose2d( ngf * 2, ngf, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ngf),
        nn.ReLU(True),
        
        nn.ConvTranspose2d( ngf, nc, 4, 2, 1, bias=False),
        nn.Tanh()
        
    )

def forward(self, input):
    return self.main(input)

----------------------------------------------------------------------------------------------------

<판별기>
class Discriminator(nn.Module):
def __init__(self, ngpu):
    super(Discriminator, self).__init__()
    self.ngpu = ngpu
    self.main = nn.Sequential(
        # 입력 데이터의 크기는 ``(nc) x 64 x 64`` 입니다
        nn.Conv2d(nc, ndf, 4, 2, 1, bias=False),
        nn.LeakyReLU(0.2, inplace=True),
        # 위의 계층을 통과한 데이터의 크기. ``(ndf) x 32 x 32``
        nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 2),
        nn.LeakyReLU(0.2, inplace=True),
        # 위의 계층을 통과한 데이터의 크기. ``(ndf*2) x 16 x 16``
        nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 4),
        nn.LeakyReLU(0.2, inplace=True),
        # 위의 계층을 통과한 데이터의 크기. ``(ndf*4) x 8 x 8``
        nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 8),
        nn.LeakyReLU(0.2, inplace=True),
        # 위의 계층을 통과한 데이터의 크기. ``(ndf*8) x 4 x 4``
        nn.Conv2d(ndf * 8, 1, 4, 1, 0, bias=False),
        nn.Sigmoid()
    )

def forward(self, input):
    return self.main(input)

DCGAN을 변형하여 만들어진 생성모델들이 많습니다. 다양한 GAN 모델들을 보기 전에 참고하면 좋습니다.

본 포스팅은 여기서 마칩니다.


참고문헌

[1] DCGAN 설명

[2] DCGAN 논문

[3] DCGAN tutorial

[4] 이미지 생성 예시

업데이트: