Autoencoder의 여정 Chap.1 [목적지는:VAE의 구현]

2019. 1. 17. 02:41AI/Vision

오늘은 Auto-encoder에 다뤄보도록 하겠습니다.

대략적인 구조는 아래와 같습니다.




매커니즘.

-Input이 있을 때 이값들에 대한 피쳐들을 학습 한 후 다시 출력한 결과의 output값이 Input과 같아야 합니다.


무슨 말인고 하니  Input을 분해하여 hidden layers를 통과 시켰을때 똑같은 Input으로 재구성하여야한다 이말입니다. 

즉, 정답이 필요없는 Unsupervised 학습인거죠.


그러면 이 모델의 구성은 어떻게 되어있을까요?

- 위 사진을 유심히 살펴보시면 눈치 채셨겠지만, 

'입력->인코더->약간의 은닉층->디코더->결과' 로 구성되어있습니다.




autoencoder는 여러가지에서 쓰이지만, data compression 특성이 강하기 때문에 주로 analysis를 위한 classification에 많이 쓰이는 것 같습니다.



Q1. Deep learnin에서는 히든층이 많으면 많을 수록, 더 좋은 성능을 기대할 수있는데 오토인코더에서 입력보다 히든층의 갯수를 늘리게 되면 어떻게 되지요?


ans: 괜찮은 발상이긴합니다만, 오토인코더의 히든층의 갯수가 입력층의 갯수보다 많아질경우 인코더의 기능을 상실하여, input값에 대한 피쳐를 그대로 학습하게됩니다. 즉, 있는 값을 그대로 돌려보내주게 되는데, 이는 모델이 오버피팅에 빠지게 되는 것입니다.



구현


여기서 구현해볼 auto encoder의 구조 입니다.


케라스를 이용한 model의 summary 출력값.



일반 fully-connected만 사용해도 되지만, conv를 사용한 이유는 좀 더 높은 성능을 내기위함입니다.

*variational autoencoder를 위한 밑작업.



사용한 데이터셋: MNIST



코드를 살펴보겠습니다.




케라스 라이브러리 및 mist데이터 import 및

데이터 형식을 (28,28,1)이 되도록 구조 제조정

모델 구성 및 auto인코더의 구현입니다

모델의 구조는 아래와 같습니다.


옵티마이저로는 adam을 쓰고 loss는 크로스 엔트로피를 사용하였습니다. 결국 출력과 입력의 두개에 대한 데이터 피쳐의 비교이기때문에 마지막엔 sigmoid를 달아주었습니다.


보통 학술 자료에는 autoencoder에대한 hidden layer가 하나만있지만 저는 더 좋은 성능을 내기위해 hidden layer를 두개 사용하였습니다. 이것을 stacked auto-encoder 라고 부릅니다. 

일반 auto encoder보다 훨씬 좋은 성능을 발휘하지요. 






결과





위가 test input

아래가 오토인코더를 통과한 result 입니다.

맨마지막 9랑 5부분이 약간 흐릿하긴하지만 꾀나 잘작동하지요? 


다음엔  KLD랑 maximum likelihood esimation이 무엇인가? 에 대해 한번 다뤄보겠습니다.