DCGAN - (5) Discriminator 구현 및 학습 결과

Previous Article: DCGAN - (4) Generator 구현

tensorflow tutorial에서 제시하는 Discriminator Architecture는 좀 더 간단하며, 총 세가지의 layer로 이루어져 있다. Generator와 다르게 크기를 줄여나가야 하므로 일반적인 convolutional layer를 사용한다. tensorflow에서의 code는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def make_discriminator_model():
model = tf.keras.Sequential()
model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same',
input_shape=[28, 28, 1]))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))

model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))
model.add(layers.LeakyReLU())
model.add(layers.Dropout(0.3))

model.add(layers.Flatten())
model.add(layers.Dense(1))

return model

위 코드를 pytorch에서 구현해보자.

첫번째 layer에서는 28X28X1 image를 14X14X64 feature maps로 만든다. 이 때, parameter는 in_channel: 1, out_channel: 64, kernel_size: 5, stride: 2, padding: 2을 사용한다.

두번째 layer에서는 14X14X64 feature maps를 다시 7X7X128 feature maps로 만든다. parameter는 마찬가지로 in_channel: 64, out_channel: 128, kernel_size: 5, stride: 2, padding: 2을 사용한다.

마지막 layer에서는 7X7X128 feature maps를 scala로 만든다. 이 때, tensorflow에서는 Flatten 이후에 Dense(1)로 지정하면 바로 scala로 mapping해주지만, pytorch에서는 Flatten했을 때의 node 개수를 Linear(#node,1)의 형태로 지정해줘야 한다. 구현한 pytorch 코드는 아래와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Discriminator(nn.Module):
def __init__(self, ngpu):
super(Discriminator, self).__init__()
self.ngpu = ngpu
self.main = nn.Sequential(
nn.Conv2d(1,64,5,2,2,bias=False),
nn.LeakyReLU(0.3,True),
nn.Dropout2d(0.3),

nn.Conv2d(64,128,5,2,2,bias=False),
nn.LeakyReLU(0.3,True),
nn.Dropout2d(0.3),

nn.Flatten(),
nn.Linear(7*7*128,1),
nn.Sigmoid()
)
def forward(self, input):
return self.main(input)

이렇게 설정을 마친 후에 학습을 진행하게 되면 다음과 같은 images가 생성됨을 확인할 수 있었다.

Generated Images for MNIST

다소 Blur된 부분도 보이고, 부정확한 숫자도 보이지만 숫자스러운(?) 모양이 나타났다는 것에 의의를 두도록 하겠다. 이 GAN모델은 첫번째 글에서 언급한대로 두 분포 가 같음이 보장되어야 하기에 안정성 측면에서 이슈가 있으며 위와 같이 부정확한 결과가 도출되기도 하는 것이다. GAN에 대한 공부는 여기서 마치고, 보다 발전된 모델을 알아보도록 하자.

Share