DCGAN
본 포스팅은 DCGAN에 대한 내용입니다.
DCGAN 이란?
DCGAN(Deep Convolution Generative Adversarial Network)은 Convlution layer로 이루어진 생성기와 이 생성기와 반대로 구성된 판별기가 있습니다[1]. 합성곱을 기반으로 연산이 이루어지기 때문에 데이터의 형태를 보존할 수 있고, 그로 인해 그럴듯한 이미지를 만들 수 있습니다. 이 모델은 합성곱을 사용함으로써 생성 모델의 큰 단점이었던 mode collepse(모델이 학습을 못 하는 상태)를 개선 했습니다. 아래는 논문에 나온 이미지 생성 예시입니다. 입력으로 선글라스를 낀 남자의 사진, 선글라스를 끼지 않은 남자의 사진, 선글라스를 끼지 않은 여자의 사진을 넣으면 모델이 각 이미지의 특징을 학습하여 선글라스를 낀 여자의 사진을 생성합니다[2].
구조
모델의 구조는 아래 그림에서 확인할 수 있습니다. 입력값은 정규분포에서 추출한 잠재공간 벡터 z이고, 생성기에서는 점점 채널 수를 줄여 필요한 정보만 남도록 하고, 마지막 블럭(3채널)을 통과하여 만들어진 이미지를 판별기에 넣습니다. 판별기가 정확하게 가짜를 분류할수록 생성기는 더 진짜 같은 이미지를 만들 것이고, 판별기와 생성기가 경쟁을 하며 학습을 합니다. 판별기의 마지막 층에서 시그모이드 함수를 사용하여 0~1 사이의 확률 값으로 조정합니다. 이 값이 0.5 이상이면 진짜, 미만이면 가짜로 분류합니다.
모델 구현 예
하기 코드는 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] 이미지 생성 예시