GAN
2020. 12. 14. 14:46ㆍDeep Learning/개념
728x90
※ 본 카테고리의 글은 youtube Sung Kim <모두를 위한 딥러닝> 강좌, 책<모두의 딥러닝> 및 다른자료들을 참고하여 작성되었습니다. ※
github: github.com/chaeyeongyoon/DeepLearning_basics
GAN(Generative Adversarial Network, 생성적 적대 신경망) 은 딥러닝의 원리를 이용해 '가상의 이미지'를 생성합니다.
Generator와 Discrminator은 보통 위조지폐범과 경찰로 비유되며, 둘의 경합으로 인해 더욱 정교한 가상 이미지가 생성됩니다.
그 중 가장 많이 사용되는 Facebook AI팀의 DCGAN에 대해 소개하겠습니다.
< DCGAN >
DCGAN은 GAN에 CNN을 적용한 것이라고 생각하면됩니다.
● Generator
가짜 이미지 생성에 CNN을 이용합니다. 하지만 조금 차이가 있습니다.
- Optimizer을 사용한 최적화 / compile과정이 없습니다. 생성자에서는 학습이나 판별같은 기능을 하지 않기 때문입니다.
- Pooling을 사용하지 않고 입출력 크기를 똑같이 만들기 위한 padding만을 적용합니다.
- Batch Normalization을 적용해 데이터 평균을 0, 분산을 1로 재배치 하여 다음층으로 입력될 값을 일정하게 재배치 합니다. 이는 층 개수가 늘어나도 (모델이 deep해져도) 안정적인 학습을 할 수 있도록 해줍니다.
- 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 |