본문 바로가기

컴린이 일기장/Today I Learned

[TIL] DCGAN 이용해 Fashion MNIST 이미지 생성하기

반응형

[주절주절]

StyleGAN, StarGAN 코드를 보려는데 파일은 왜 이렇게 여러 개며, 함수, class는 왜 이리 많은지..? 4~5일을 제자리걸음 하며 방황했다. 이해를 한다 하더라도 사용할 때 내가 짠 코드가 아니라서 분명 버벅거릴 거 같아서 사실상 참고해서 직접 '구현'을 해야 하지 않을까.. 생각! (팀원들은 아닌 것 같지만) 곰곰이 생각해보니 기본 중의 기본 DCGAN도 혼자 구현해보라고 하면 못할 거 같아서, (DCGAN과 StyleGAN의 거리는 꽤나 있어 보이지만) DCGAN부터 다시 하나씩 해보자는 마음으로 끄적대기 시작했다.

 

[Today I Learned]

# 변수 이름 잘 짓기

파이썬은 기본적으로 내장된 함수가 많아서, 함수 이름과 같은 이름의 변수를 짓고 사용하게 되면 내장 함수가 제 역할을 하지 못하게 된다. 나는 iteration을 나타내기 위해 iter라는 변수를 사용하는 바람에 iter() 함수를 망가뜨렸다(?).  

사실 그렇게 까다로운 데이터도 아닌데 학습에 꽤나 애를 먹었다. G와 D의 Loss 값, D(Real image), D(Fake image) 이렇게 네 개의 값을 쭉 관찰했는데 아래와 같은 문제들이 있었다. 나름대로 분석한 원인과 해결방안도 덧붙였는데 혜피셜이니 주의하자! 🤦‍♀️

지금부터 D(Real image)는 D(R), D(Fake image)는 D(F)라고 표현하겠다. 

◾ 네 값 모두 학습 초기의 값에서 거의 변하지 않음

개인적으로 가장 답답한 상태다. 소수 셋째 자리까지 출력하게 해 놓았는데 셋째 자리만 1~3 정도 변하는 상태가 계속된다. D의 초기 상태 혹은 학습이 잘 된 이상적인 상태는 Real image와 Fake image를 제대로 구분하지 못하는 것, 즉  D(R)과 D(F)가 0.4~6 정도의 값을 가져야 한다는 뜻이다.

흐-뭇

이 경우에 주로 D(R), D(F)은 0.4~0.5의 값을 보였다. 학습 초기에는 비교적 과제가 쉬운 (분류가 생성보단 훨씬 쉬우니까)  Discriminator가 쪼금 더 (압도적이면 또 안된다, 쪼금이어야한다) 좋은 성능을 내며 G의 학습을 이끌고 나가야 하는데 그렇지 못한 상태라고 분석해볼 수 있겠다.

D의 loss는 계속 감소, G loss는 계속 증가 (= D(R)은 1에 수렴, D(F)는 0에 수렴)

 

D의 성능이 G의 성능에 비해 압도적으로 좋은 경우다.  나는 15~20 epoch 정도를 줬는데, 5 epoch 정도에서부턴 이미지를 잘 만들어내고 그 이후 epoch에서는 뚜렷한 성능 증가 없이 G loss만 조금씩 증가하는 모습을 볼 수 있었다. 아래 이미지를 보면 실제로 17, 18 epoch에서는 오히려 더 이상한 이미지를 만들어 내는 것을 확인할 수 있다. (사실 데이터 사이즈, 흑백임을 고려하면 20 epoch까지 돌릴 필요가 없다고 생각한다.)

D 1회, G 1회 번갈아가며 학습

이 문제를 해결하기 위해 G를 D보다 더 자주 학습시키는 방법을 적용해보았다. 처음엔 D를 N iteration마다 학습시키는 식으로 설정했었는데, D가 너무 학습이 안되어서 전반적인 학습 자체를 끌고 나가지 못하는 문제가 발생했다. 그래서 최종적으로는 5 epoch까지는 G와 D를 1회, 1회 같은 빈도로 학습을 시키다가 이후부터는 D는 3~5 iteration마다 학습시켰다. 100 iteration 마다로도 설정해보았는데 모든 인풋 벡터에 대해 같은 이미지를 만들어내는 Mode collapse 현상이 발생했다. 10 iteration을 주었을 때는 신발류끼리, 상의류끼리 비슷한 이미지를 만들어내었다. 

5 epoch까지는 D 1회, G 1회 번갈아가며 학습 이후 epoch부터는 D는 5 iteration마다 학습

위 이미지가 5 iteration마다 G를 학습시켰을 때의 epoch 별 결과물이다. 사실 성능이 눈에 띄게 개선되지는 않았지만... 학습 막판에  일그러지는 정도가 좀 줄어들었다는 정도? learning rate decay를 시킨다던지 시도해볼 만한 다른 방법들이 남아있었지만 정말 저 사진 좀 그만 보고 싶어서 여기서 그만뒀다. DCGAN 구조 자체는 어느 모델에나 다 있으니까... 

https://github.com/HyelinNAM/TIL/blob/master/GAN/0402_DCGAN.ipynb

 

[질문 노트]

Q. 비전 모델의 핵심은? 레이어 종류? 레이어 수? 피처맵 수? 어떤 모델을 가져다 쓸 때, 내 데이터 resolution에 맞게 모델을 수정해야할 때가 있는데 그때 어떤 것을 최우선으로 유지해야할까?

A. '메인 아이디어'에 따라 다르다. 메인 아이디어라하면 Resnet의 잔여 학습 같은게 될 수 있겠다. 따라서 필터 수, 스트라이드 등의 값보단 메인 아이디어가 중요! 그런데 이런 값들이 해당 모델의 메인 아이디어에 속하는 경우도 있을 수 있겠다. 결론은 모바모, 논바논. // 201106

Q. 다른 사람들은 모델을 구현할 때 어떤 루틴으로?

Q. 모델 구현에 있어서 좋은 방법, 나쁜 방법이 있을까? 어느 정도까지가 개인의 스타일이고 어디부턴 나쁜 습관일까?

Q. 코드 리뷰는 어디서,어떻게 받을 수 있을까?

Q. 벡터를 GPU 딴으로 올려주어야할 때가 있다. 반대로 CPU 딴으로 내려주어야할때도. (그렇게 중요한 질문은 아닌 거 같지만) 이 과정은 왜 필요하지?

Q. 이미지 데이터는 학습이 오래걸리는데 중간에 모드 콜랩스 같은 문제가 문제가 찾아오면? GAN은 Loss 값을 기준으로는 모델을 저장할 지점을 정할 수 없는데 어떡하지?

 

오늘의 베스트컷

반응형