이번에는 AE 모델을 만들어보자
try:
%tensorflow_version 2.x"
except Exception:
pass
import tensorflow as tf
import numpy as np
from tensorflow.keras import layers,models,datasets
import matplotlib.pyplot as plt
모델을 작성하기 전 간단히 패키지를 선언한다.
(x_train,_),(x_test,_) = datasets.mnist.load_data()
학습에 사용할 데이터셋은 Mnist이고
AE는 비지도 학습이므로 y의 값을 불러 올 필요가 없다.
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') /255.0
x_train = x_train.reshape(-1,784)
x_test = x_test.reshape(-1,784)
AE를 학습하기에 앞서 데이터셋을 바꿔줘야 할 필요가 있다.
AE는 순방향 신경망을 사용하기 때문에 2차원의 형태로 바꿔줘야 하고 데이터의 값 또한 정규화를 해줄 필요가 있다.
Hidden_input = 48 #압축 크기
input_layer = layers.Input(shape=(784,))
Encoding = layers.Dense(Hidden_input)(input_layer)
Decoding = layers.Dense(784, activation='sigmoid')(Encoding)
autoencoder = models.Model(input_layer,Decoding)
encoder = models.Model(input_layer,Encoding)
encoded_input = layers.Input(shape=(Hidden_input,))
decoder_layer = autoencoder.layers[2]
decoder = models.Model(encoded_input,decoder_layer(encoded_input))
AE의 모델을 만들자.
여태까지 모델을 만들었을 때는 시퀀셜(sequential)을 사용하여 모델을 만들었지만
이번에 사용하는 데이터셋은 시계열 데이터가 아니기 때문에 사용하지 않는다.
그래서 입력크기를 지정을 해야하는데 입력레이어를 만들어 해당 역활을 하게 한다.
AE의 구조는 간단히 설명하면 이미지를 압축 후 다시 원복 시키는 형태를 띈다.
이미지를 원복시키는 과정에서 손실이 발생하게 된다.
autoencoder.compile(optimizer='adam',loss='binary_crossentropy',metrics=['acc'])
컴파일 코드다.
사용한 옵티마이저는 아담이고, 로스는 이진크로스엔트로피를 사용하였다
(ps.이진 크로스엔트로피는 시그모이드엔트로피라고 불립니다)
autoencoder.fit(x_train,x_train,epochs=50,shuffle=True,validation_data=(x_test,x_test))
학습을 진행한다..
y의 값의 y_train이 아닌 x_train을 넣음으로써 비지도학습인 것을 나타낸다.
predict_encoded_img = encoder.predict(x_test)
predict_decoded_img = decoder.predict(predict_encoded_img)
학습이 끝난 모델을 x_test를 넣어 예측을 해보자.
원래 이미지와 예측한 이미지를 비교를 해보자
위에 있는 이미지가 원본 이미지고 아래에 있는 이미지는 예측 이미지다
이미지를 볼 때는 원본 이미지의 형태를 잘 띄는 것처럼 보이지만 자세히 보면 군데군데 이미지의 손실이 발생한 것을 확인 할 수 가 있다
AE는 압축 과정에서 이미지의 손실이 발생하는게 가장 큰 원인이다.
작성자 김강빈 kkb08190819@gmail.com / 이원재 ondslee0808@gmail.com
'【7】AutoEncoder 기본 다지기 > 이미지 생성 실습으로 익히는 AE' 카테고리의 다른 글
Deep AE를 이용한 가짜 이미지 생성 (0) | 2020.03.26 |
---|