GAN

2020. 12. 14. 14:46Deep Learning/개념

728x90

※ 본 카테고리의 글은 youtube Sung Kim <모두를 위한 딥러닝> 강좌, 책<모두의 딥러닝> 및 다른자료들을 참고하여 작성되었습니다. ※

github: github.com/chaeyeongyoon/DeepLearning_basics

 

chaeyeongyoon/DeepLearning_basics

Contribute to chaeyeongyoon/DeepLearning_basics development by creating an account on GitHub.

github.com

 

GAN(Generative Adversarial Network, 생성적 적대 신경망) 은 딥러닝의 원리를 이용해 '가상의 이미지'를 생성합니다. 

Generator와 Discrminator은 보통 위조지폐범과 경찰로 비유되며, 둘의 경합으로 인해 더욱 정교한 가상 이미지가 생성됩니다.

그 중 가장 많이 사용되는 Facebook AI팀의 DCGAN에 대해 소개하겠습니다.

 

 

 

 

< DCGAN >

DCGAN은 GAN에 CNN을 적용한 것이라고 생각하면됩니다.

● Generator

가짜 이미지 생성에 CNN을 이용합니다. 하지만 조금 차이가 있습니다.

  1.  Optimizer을 사용한 최적화 / compile과정이 없습니다. 생성자에서는 학습이나 판별같은 기능을 하지 않기 때문입니다.
  2.  Pooling을 사용하지 않고 입출력 크기를 똑같이 만들기 위한 padding만을 적용합니다.
  3. Batch Normalization을 적용해 데이터 평균을 0, 분산을 1로 재배치 하여 다음층으로 입력될 값을 일정하게 재배치 합니다. 이는 층 개수가 늘어나도 (모델이 deep해져도) 안정적인 학습을 할 수 있도록 해줍니다.
  4. activation function으로 ReLU를 사용하지만, 판별자로 넘겨주기 직전엔 tanh()를 사용합니다. 이는 출력값을 -1~1 사이 값으로 만들어주므로 판별자에 입력될 이미지의 픽셀값 범위도 -1~1로 변환시켜주어야합니다.

이를 코드로 나타내보겠습니다. (keras 이용)

# MNIST data 기준
generator = Sequential() 
generator.add(Dense(128 * 7 * 7, input_dim=100, activation=LeakyReLU(0, 2)))
generator.add(BatchNormalization())
generator.add(Reshape(7, 7, 128)) # input shape for Conv2D() layer
generator.add(Upsampling2D())
generator.add(Conv2D(64, kernel_size=5, padding='same'))
generator.add(BatchNormalization())
generator.add(Activation(LeakyReLU(0, 2))) # Prevent Vanishing Gradient Problem
generator.add(Upsampling2D())
generator.add(Conv2D(1, kernel_size=5, padding='same', activation='tanh')
  • input_dim = 100차원의 random vector 준비해 집어넣음( 적절한 숫자 넣으면 된다)
  • 처음에 input을 7*7로 넣고 이후 Upsampling2D를 두번 적용해 주어(w, h를 2배로 만들어주는 역할) mnist이미지 크기인 28*28로 만들어준다. 이렇게 작은 크기의 이미지를 점점 늘려가며 conv layer에 넣어주는 것이 DCGAN의 큰 특징이다.

● Discriminator

discriminator은 crossentropy, adam, dropout, batchnormalzation등등 CNN구조를 그대로 사용하면됩니다.

CNN자체가 구별 / 구분에 최적화된 알고리즘이므로 1: 진짜 0: 가짜 이렇게 판별하는데에 적합한 것이죠.

discriminator = Sequential()
discriminator.add(Conv2D(64, kernel_size=5, strides=2, input_shape=(28, 28, 1), padding='same'))
discriminator.add(Activation(LeakyReLU(0.2)))# alpha: Float >= 0. Negative slope coefficient. Default to 0.3.
discriminator.add(Dropout(0.3))
discriminator.add(Conv2D(128, kernel_size=5, strides=2, padding='same'))
discriminator.add(Activation(LeakyReLU(0.2)))
discriminator.add(Dropout(0.3))
discriminator.add(Flatten())
discriminator.add(Dense(1, activation='sigmoid'))
discriminator.compile(loss='binary_cross_entropy', optimizer='adam')
discriminator.trainable = False # only prediction
  • stride=2는 dropout, pooling과 같이 새로운 특징을 뽑아주는 효과가 있습니다. 
728x90

'Deep Learning > 개념' 카테고리의 다른 글

GoogleNet(Inception V1)  (0) 2020.12.14
VGG16  (0) 2020.12.14
RNN  (0) 2020.12.13
CNN  (0) 2020.12.13
GD Algorithm(경사하강법)/ Backpropagation(오차 역전파)/Activation function  (0) 2020.12.13