# library import

from keras.datasets import mnist

from keras.layers import Input, Dense

from keras.models import Model # <=기존 모델의 인풋 값과 내 모델의 아웃풋 값을 전달

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

==========================

#data load

(X_train, _), (X_test, _) = mnist.load_data()

#chage types as a real value 

X_train = X_train.astype('float32')/255

X_test = X_test.astype('float32')/255

#reshape the data from (60000, 28,28) , (10000, 28,28)to (60000, 784), (10000, 784)  

X_train = X_train.reshape(len(X_train), np.prod(X_train.shape[1:]))

X_test = X_test.reshape(len(X_test), np.prod(X_test.shape[1:]))

print(X_train.shape)

print(X_test.shape)

 

#set input layer

input_img= Input(shape=(784,))

#===================encoder================================#

encoded = Dense(units=128, activation='relu')(input_img)

encoded = Dense(units=64, activation='relu')(encoded) ###

encoded = Dense(units=32, activation='relu')(encoded)

#===================decoder================================#

decoded = Dense(units=64, activation='relu')(encoded)

decoded = Dense(units=128, activation='relu')(decoded)

decoded = Dense(units=784, activation='sigmoid')(decoded)

Input layer, Enc. Dec. Network 개념도

중간에 네트워크 짜는 개념은 알고 가야 할 것 같아서 설명을 넣는다. 

- 상기와 같이 초기에 전처리한 Input layer를 넣고 그 다음에 차차 압축해 가면서 Encoder를 넣는다. 

- 그리고 그 다음에 압축된 데이터를 복원하기 위해 Latent space(여기서는 32)로부터 차차 다시 올라가도록 한다. 

- 그리고 이러헤 복원시키는 이미지를 사용하는 오토인코더를 만든다. (최종모델)

#####################################

autoencoder=Model(input_img, decoded) # decode를 거쳐 복원하는 최종 모델 (auto encoder)???????(확인 필요) Model의 의미

autoencoder.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])

autoencoder.fit(X_train, X_train,

                epochs=50,

                batch_size=256,

                shuffle=True,

                validation_data=(X_test, X_test))

#####################################

encoder = Model(input_img, encoded) # encode를 거쳐 lated space로 압축하는 모델(확인 필요)

다음은 실수로 오토인코딩 하는 코드 살펴 보는 것으로 하는 것으로

 

Auto Encoder란 무엇인가

오토인코더란 비지도 학습의 하나로 사람이 라벨링을 해줘서 일일히 가르쳐 줘야 하는 지도학습과 달리(개, 고양이)분류를 하는 일반적으로 우리가 알고 있는 딥러닝과 같이

그림1. 지도 학습 알고리즘의 예시

레이블링을 따로 해 줄 필요가 없다. 

일반적으로 우리가 알고 있는 딥러닝의 구조가 그림2와 같다면 오토인코더의 구조는 그림3과 같다.

그림2. 딥러닝의 구조
그림3. 오토인코더의 구조

간단하게 설명하면 딥러닝을 2개 붙여놓은 구조이다.

  • 하나의 딥러닝 구조는 Encoder로 Hidden(latent space)로 압축 하는 것. 
  • 하나의 딥러닝 구조는 Decoder Hidden(latent space)으로 압축된 것에서 원본으로 복원하는 것. 

따라서 Auto Encoder를 거치면 원래의 Data를 비슷하게 복원할 수 있다.

하지만 Decoder는 Train Data즉 학습 Data만 제대로 복원할 수 있고 학습하지 않은 Data는 제대로 복원할 수 없다. 


 오토 인코더에 대해서는 자세한 수식도 있고 이에 대해서 설명한 글도 많이 있지만 이는 이해하지 못했으므로 추후에 포스팅 하도록 하고 이번에는 개념적인 것만 포스팅 하도록 한다. 

참고: https://lewisxyz000.tistory.com/22

+ Recent posts