Path: blob/master/site/ko/tutorials/generative/dcgan.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
딥 컨볼루셔널 생성적 적대 신경망
이 튜토리얼은 딥 컨볼루셔널 생성적 적대 신경망(Deep Convolutional Generative Adversarial Networks, DCGAN)을 이용하여 손으로 쓴 숫자의 이미지를 생성하는 방법을 보여줍니다. 이 코드는 Keras Sequential API 및 tf.GradientTape
훈련 루프를 사용하여 작성되었습니다.
생성적 적대 신경망(GAN)이란?
생성적 적대 신경망(Generative Adversarial Networks, GAN)은 최근 컴퓨터 과학에서 가장 흥미로운 아이디어 중 하나입니다. 두 개의 모델이 적대적인 과정을 통해 동시에 훈련됩니다. 생성자("예술가")는 진짜처럼 보이는 이미지 생성을 학습하고, 감별자("예술비평가")는 가짜의 이미지를 진짜 이미지와 구별하는 방식을 학습합니다.
훈련 과정 동안 생성자는 점차 진짜 같은 이미지를 더욱 잘 생성하게 되며, 감별자는 점차 진짜와 가짜를 더 잘 구별하게 됩니다. 감별자가 가짜 이미지와 진짜 이미지를 더 이상 구별할 수 없을 때 이 과정은 평형 상태에 도달하게 됩니다.
이 노트북은 이 과정을 MNIST 데이터세트를 이용하여 보여줍니다. 아래의 애니메이션에는 50 epoch 동안 훈련한 생성자를 통해 생성된 연속적 이미지가 표시됩니다. 해당 이미지는 임의의 노이즈에서 시작되어, 점차 손으로 쓴 숫자를 닮아갑니다.
GAN에 대해 자세히 알아보려면 MIT의 Intro to Deep Learning 과정을 참조하십시오.
설정
데이터세트 로드 및 준비하기
생성자와 감별자 훈련을 위해 MNIST 데이터세트가 사용됩니다. 생성자는 손글씨 숫자 데이터를 닮은 숫자를 생성할 것입니다.
모델 만들기
Keras Sequential API를 사용해 생성자와 감별자가 정의됩니다.
생성자
생성자는 시드값(임의의 노이즈)에서 이미지를 생성하기 위해, tf.keras.layers.Conv2DTranspose
(업샘플링) 레이어를 이용합니다. 처음 Dense
레이어는 해당 시드값을 입력값으로 받습니다. 다음으로 원하는 크기인 28x28x1의 이미지에 도달할 때까지 업샘플링을 여러 번 수행합니다. tanh 함수를 사용하는 출력 레이어를 제외한 각 레이어에서 tf.keras.layers.LeakyReLU
활성화가 사용됩니다.
(아직 훈련되지 않은) 생성자를 이용해 이미지를 생성해 보겠습니다.
감별자
감별자는 컨볼루셔널 신경망(Convolutional Neural Network, CNN) 기반의 이미지 분류자입니다.
(아직까지 훈련되지 않은) 감별자를 사용하여 생성된 이미지가 진짜인지 가짜인지 판별합니다. 진짜 이미지에는 양수의 값을, 가짜 이미지에는 음수의 값을 출력하도록 모델이 훈련됩니다.
손실과 옵티마이저 정의하기
두 모델의 손실 함수와 옵티마이저를 정의합니다.
감별자 손실
이 메서드는 감별자가 가짜 이미지와 진짜 이미지를 얼마나 잘 판별하는지 수치화합니다. 진짜 이미지에 대한 감별자의 예측과 1로 이루어진 배열을 비교하고, 가짜로 (생성된) 이미지에 대한 감별자의 예측과 0으로 이루어진 배열을 비교합니다.
생성자 손실
생성자의 손실은 판별자를 얼마나 잘 속일 수 있었는지를 수치화합니다. 직관적으로, 생성자가 잘 작동하면 판별자는 가짜 이미지를 실제(또는 1)로 분류합니다. 여기에서 생성된 이미지에 대한 판별자의 판단을 1의 배열과 비교합니다.
판별자와 생성자 옵티마이저는 두 네트워크를 별도로 훈련하기 때문에 서로 다릅니다.
체크포인트 저장하기
이 노트북은 오랫동안 진행되는 훈련이 중단된 경우 유용한 모델의 저장 및 복구 방법을 보여줍니다.
훈련 루프 정의하기
생성자가 입력으로 임의의 시드를 받으면 훈련 루프가 시작됩니다. 해당 시드는 이미지를 생성하는 데 사용됩니다. 감별자를 사용하여 (훈련 세트에서 가져온) 진짜 이미지와 (생성자를 통해 생성된) 가짜 이미지를 분류합니다. 각 모델의 손실을 계산하고, 그래디언트를 사용해 생성자와 감별자를 업데이트합니다.
이미지 생성 및 저장하기
모델 훈련하기
위에서 정의한 train()
메서드를 호출하여 생성자와 판별자를 동시에 훈련합니다. GAN 훈련은 까다로울 수 있습니다. 생성자와 판별자가 서로를 압도하지 않는 것이 중요합니다(예: 비슷한 속도로 훈련됨).
훈련 초기에 생성된 이미지는 무작위 노이즈처럼 보입니다. 훈련이 진행됨에 따라 생성된 숫자는 점점 더 실제처럼 보일 것입니다. 약 50 epoch 후에는 MNIST 숫자와 유사합니다. Colab의 기본 설정에서 이 작업은 epoch당 약 1분 정도 소요될 수 있습니다.
마지막 체크포인트를 복구합니다.
GIF 생성하기
imageio
를 통해 훈련 중 저장된 이미지를 사용한 GIF 애니메이션을 만듭니다.
다음 단계
이 튜토리얼은 GAN을 작성하고 훈련하는 데 필요한 전체 코드를 보여주었습니다. 다음 단계로 Kaggle에서 사용할 수 있는 대규모 유명인 얼굴 특성(CelebA) 데이터세트와 같은 다른 데이터세트를 실험해볼 수 있습니다. GAN에 대해 자세히 알아보려면 NIPS 2016 튜토리얼: 생성적 적대 네트워크를 참조하세요.