• 주의 :
    이 글은 100퍼센트 의식의 흐름 기법으로 작성되었습니다.
    개인의 주관 또한 담겨있습니다.

CNN과 RNN을 패스하고, 지금 내가 공부하고 있는 GAN에 대해서 알아보자.
일단... GAN이 뭔가... 하면.
진짜 같은 가짜 만드는 'GAN' 이라고 하는데,
내가 생각할 때는 그냥 -무언가를 만드는 네트워크- 라고 생각하면 쉽다.
일단 제대로 된 정의는

Generative Adversarial Networks

구글 번역기에 돌리면

생성 적 적대 네트워크

이라고 하는데, idk 나도 모르겠다.

일단 내가 이걸 왜하는가..? 에 대한건

재미있어 보여서

사실 이 정도면 충분한 이유가 아닌가?

일단 알아보자.
처음 나온 논문을 확인해보면
https://arxiv.org/abs/1406.2661
이 논문인데, 도저히 영어로 되어있는 논문은 못읽겠다 싶으면 찾아보시길 바란다.
논문에 대한 해석은 하지 않도록 하겠다.

나는 gan을 접근할 때, 처음에 이런 생각으로 접근했다.

GAN은 판별자와 생성자를 가지고 blahblah ~

이 생각을 하고 접근을 하니 코드의 틀이 딱 잡히더라
우리에게 필요한 것들은

discriminator - 판별자
generator -생성자

라는 것을 생각해볼 수 있다.

그럼 논문에서 나온 생성자와 판별자를 Tensorflow 라이브러리를 이용해서 나만의 방법으로 구현을 해보겠다.

def discriminator(self, x, reuse=None):
       with tf.variable_scope('discriminator', reuse=reuse):
           x = tf.layers.flatten(x)

           layer = tf.layers.dense(x, units=self.fc_unit, activation=tf.nn.leaky_relu, name='d-fc-1')
           layer = tf.layers.dense(layer, units=1, activation=tf.nn.sigmoid, name='d-fc-2')

       return layer

다음과 같이 구현할 수 있을 것이다.
이건 DNN을 구현한다고 생각하면 편하다.
why?
판별자는 말 그대로 판별하는 함수다. 즉, generator에서 만들어진 것을 판별하기 위해서는 DNN이 필요할 것이다. 그렇다면 generator는 어떻게 구현할 것인가?

구현해보기 전에 생각해 볼 만한 것이 있다. DNN을 생각해보면 사진의 여러개의 픽셀을 한개의 값으로 수렴시킨다. 그렇다면 generator는 반대가 아닐까 라는 생각을 해볼만하다. 한개의 값에서 여러가지 픽셀을 만들어내는 것.

이 또한 나만의 방법으로 구현을 해보겠다.

 def generator(self, z, reuse=None):
        with tf.variable_scope('generator', reuse=reuse):
            layer = tf.layers.dense(z, units=self.fc_unit, activation=tf.nn.leaky_relu, name='g-fc-1')
            layer = tf.layers.dense(layer, units=self.img_size, activation=tf.nn.sigmoid, name='g-fc-2')

        return layer

이렇게 구현해 볼 수 있겠다.

GAN은 지금 발달한 네트워크보다 쉽게 구현할 수 있다. 아무래도 처음 만들어진 것이다 보니 그런 것 같다. 다른 CycleGAN과 같은 것들은 나중에 도전할 기회가 있다면 도전해볼 것이다. 아무튼 이렇게 discriminator와 generator를 만들어봤으니, loss와 train을 만든다면 코드를 완성할 수 있을 것이다.

내 코드는 https://github.com/han3l/GAN-Tensorflow/tree/master/GAN 에서 볼 수 있다. 나는 mnist dataset을 사용했다.

이상 의식대로 생각대로 써보았다. 틀린 것이 많이 있을텐데 지적해주신다면 감사합니다 (_ _);