관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

합성곱 신경망 14 - GAN(생성적 적대 신경망) 동영상 파일로 만들기 본문

인공지능/딥러닝

합성곱 신경망 14 - GAN(생성적 적대 신경망) 동영상 파일로 만들기

huenuri 2024. 11. 3. 19:20

조금 전에 실행이 안 되는 코드가 있어서 무척 마음이 안 좋았다. 코드가 틀려서 안 되는 것이 아니라 계속해서 코랩을 실행 중에 중단이 되었다. 인터넷은 잘 연결되고 쿠키와 모든 기록도 삭제했음에도 여전히 되지 않았다.

아무튼 조만간 이 문제를 반드시 해결해 볼 것이다. 이제 GPU를 쓰기가 겁나며 또 코드가 중단되면 어떡하나 하는 걱정이 들기도 하다. 그래도 다음 학습을 하는 데까지 진행해 보려고 한다.


 

 

 

GAN에 대하여

2014년 굿펠로 등에 처음 소개된 GAN(Generative Adversarial Network)은 생산적 적대 신경망이리고 번역할 수 있다. '생산적'이라는 것은 Gererator(생산자)가 학습에 필요한 데이터를 만드는 것을 나타내고, '적대적'이라는 것은 만들어지는 데이터가 Discriminator(판별자)를 속이기 위한 가짜이기 때문이라고 해석할 수 있다.

GAN은 다음과 같이 위조지폐를 만든 범죄자와 경찰 관계를 비유하여 설명한다. 범죄자는 위조지폐를 만들어내고, 경찰은 위조지폐를 판별해서 범죄자를 찾는다. 이렇게 2개의 모델이 서로 상대적으로 다른 목적을 가지고 경쟁하면서 서로를 발전시킨다.

 

판별자에 해당하는 Discriminator의 목적은 Generator가 생성해 낸 가짜 데이터와 진짜 데이터를 잘 구분하는 것이다. 즉, 이진 분류 문제를 풀게 된다. 반면에 생성자에 해당하는 Generator의 목적은 자신이 만들어낸 가짜 데이터를 Discriminator가 진짜라고 판단하도록 만드는 것이다.

 


 

 

 

 

GAN 실습해보기

라이브러리를 현재 노트북 환경으로 가져온다.

 

 

 

학습 파라미터를 설정한다.

 

 

 

실습에 사용할 mnist 데이터셋을 불러온다. 정규화하고 shape을 바꿔준다.

 

 

 

판별자(경찰) 역할을 하는 Discriminator 모델을 정의한다. 이 모델은 (28, 28, 1) 이미지를 입력받아서, 진짜인지, 가짜인지 판별하는 이진 분류 작업을 수행한다.

 

 

 

 

이번에는 생성자(범죄자) 역할을 하는 Generator 모델을 정의한다. 이 모델은 (28, 28, 1) 이미지를 입력받아서, 진짜인지 가짜인지 판별하는 이진 분류 작업을 수행한다.

 

 

 

 

 

 

옵티마이저와 Discriminator 이진 분류에 맞는 손실함수로 BinaryCrossentropy를 설정한다. 하지만 오류가 떠서 이 코드를 다음과 같이 수정하고 다음 코드와 합쳐주었다. 여기서 책과 다르게 수정한 부분은 다음과 같다. 이러한 오류는 Adam 옵티마이저가 초기화된 변수를 기억하고 있어서, g_model과 d_model의 변수 집합을 구분하지 못하고 발생하는 문제였다. g_model과 d_model 각각에 대해 별도의 옵티마이저 인스턴스를 생성하여 해결할 수 있다.

 

 

모델을 학습하면서 동영상으로 저장할 수 있도록 설정했다. 모델 학습 과정은 다음과 같이 진행된다.

  1. Generator가 batch size만큼 가짜 Data를 생성한다.
  2. 가짜 Data를 0으로 판단하도록 Discriminator를 학습한다.
  3. 진짜 Data를 1로 판단하도록 Discriminator를 학습한다.
  4. Generator가 만든 가짜 Data를 Discriminator가 진짜라고 판단하도록 Generator를 학습한다.

 

원래 코드에서는 이런 식으로 나오지 않고 937개를 일일이 하나씩 

 

 

학습이 종료되면 파일 폴더에서 다음과 같이 이미지 변환 과정을 저장한 동영상 파일을 확인할 수 있다.

 

 

 

동영상 파일이 재생되면 시간이 흐르면서 모델이 학습을 통해서 생성하는 가짜 이미지를 확인할 수 있다. epoch가 진행될수록 진짜 이미지와 비슷한 이미지를 만들어내는 것을 볼 수 있다. 하지만 실제 숫자 형태와는 거리가 있다.

 

 

 

 

앞에서 만들 GAN 구조로는 만들어지는 가짜 데이터를 조정할 수 없다. 다시 말하면 생성되는 이미지와 실제 정답 레이블과 관계가 없다. Generator가 생성하는 가짜 이미지가 원래 정답 레이블을 나타낼 수 있도록 하기 위해, One-Hot 인코딩으로 레이블 값(l_i)을 Generator와 Discriminator의 입력으로 추가한다.

 

이 코드를 실행시키면 다음과 같은 동영상 파일이 만들어진다.

 

 

 

 

 

조금 전보다 글자가 훨씬 선명해진 것이 보인다.


 

 

 

 

학습을 마치고

코드 한번 실행시키는데 너무 오래 걸려서 이 학습을 진행하는데 많은 어려움이 있었다. 마지막 두 개의 코드는 45분 이상씩 걸려 1시간 반이나 걸린 셈이다. 거기다가 책과 틀린 코드도 여러 개 있어서 그걸 수정하는데 무척 힘들었다.

하지만 결국 코드를 고쳤고 아무리 많은 시간이 걸려도 끝까지 인내하며 결과를 확인했다.

 

딥러닝을 공부하며 인내심을 배우는 것 같다. GAN은 수업 시간에 배운 것들이 더 많은 도움이 되었다. 책에서는 간단하게 소개하고 있어서 그냥 이런 게 있구나 하고 넘어갔다.