[N334] GAN(Generative Adversarial Networks)

정진우·2023년 5월 8일
0

GAN(Generative Adversarial Networks)

딥페이크의 기반이 되는 GAN

GAN이란?

생성적 적대 신경망, 실제와 유사한 데이터를 만들어내는 생성 모델
위조지폐 예시

위조지폐범에 해당하는 생성자(Generator)는 실제와 동일한 데이터를 만들기 위해 노력
탐정에 속하는 판별자(Discriminator)는 생성된 데이터가 진짜인지 아닌지 판단
처음에는 성능이 좋지 않지만 학습을 거듭하며 점점 발전

그림을 그리는 GAN


생정자는 Random Noise로부터 실제 고양이 그림과 유사한 그림을 생성
판별자는 생성자가 만들어낸 고양이 그림과 실제 고양이 사진을 임의로 입력받으며 둘을 Fake/Real로 구분하는 이진 분류를 수행
학습을 잘 마친 GAN 모델에서 생성자는 실제와 유사한 이미지를 생성하게 되어 판별자가 실제와 가짜를 잘 구분해내지 못한다 (Accuracy \approx 0.5)

  1. 라이브러리 import

  2. 데이터셋을 불러온 뒤 정규화

  3. 모델 구축하기 - 생성자
    생성자는 Random Noise로부터 이미지를 생성하기 위해 Transpose convolution을 사용하여 Upsampling을 수행
    첫 Dense층은 Random Noise를 입력받으며 원하는 이미지 사이즈인 28X28이 나오도록 Conv2DTranspose를 겹겹이 쌓는다
    은닉층의 활성화 함수는 ReLU 함수의 변형인 LeakyReLU 함수를 사용하며
    활성화 함수 이전에 배치 정규화(Batch Normalization)을 적용

  4. 모델 구축하기 - 판별자
    다음으로 판별자(Discriminator)를 구축
    합성곱 신경망(Convolutional Neural Network, CNN) 기반의 이미지 분류기이며
    은닉층의 활성화 함수는 ReLU 함수의 변형인 LeakyReLU 함수를 사용하고 Dropout을 적용

  5. 손실 함수와 옵티마이저 정의
    생성자와 판별자의 손실 함수를 정의한다
    판별자의 손실함수는 real_lossfake_loss를 더한 값
    real_loss의 경우 전체가 1인 행렬과 real_ouput을 비교하여 구하며
    fakse_loss의 경우 전체가 0인 행렬과 fakse_output을 비교하여 구한다
    생성자의 손실 함수는 전체가 1인 행렬과 fakse_output을 비교하여 구한다

  6. 모델이 저장되는 Checkpoint를 설정

  7. 훈련 루프를 지정
    1 생성자가 입력으로 Random Noise를 입력받는다
    2 입력받은 Random Noise를 사용하여 이미지 생성
    3 판별자를 사용하여 Train데이터셋의 진짜 이미지와 생성자가 만들어낸 가짜 이미지를 분류
    4 각 모델의 손실을 계산하고, 경사 하강법과 역전파를 통해 가중치를 업데이트

  8. 함수를 실행시켜 실제 훈련을 진행

profile
ㅋㄷ

0개의 댓글