본문 바로가기

BLOG/딥러닝

Convolutional AE

【8】최근 AutoEncoder 응용 모델 이해하고 사용하기 / Convolutional AE 

Convolutional AE

 

이번에는 CNN과 AE과 결합된 모델인 CAE를 실습해보자

 

이미지에서 강점을 보인 CNN이기 때문에 성능은 좋아졌다.

바로 CAE로 생성된 mnist 이미지부터 보겠습니다.

 

 

위에 있는 이미지는 원본이미지고 아래는 CAE로 나온 예측 이미지다.

손실이 거의 발생하지 않은 상태의 이미지인 것을 확인 할 수가 있다.

높은 성능을 보이기에 책에는 따로 실습을 담지 않았지만 실습파일에는 있으니 시간이 있다면 실습을 하는걸 추천한다.

 

실습은 노이즈가 섞인 이미지 데이터를 CAE로 학습하는 것을 할 것이다.

 

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

 

실습 하기 전 패키지를 선언하는데 AE와 같은 패키지들이다.

 

(x_train,_),(x_test,_) = datasets.mnist.load_data()

x_train = x_train.reshape(-1,28,28,1)

x_test = x_test.reshape(-1,28,28,1)

 

x_train = x_train.astype('float32') / 255.0

x_test = x_test.astype('float32') /255.0

 

CAE에서 사용되는 데이터셋은 Mnist다

CAE는  Conv2D를 사용하기 때문에 이미지의 크기를 3차원으로 바꿔줘야 한다.

(mnist는 불러오게 되면 (60000,28,28,1) 구조를 띄게  되는데 굳이 reshape를 안써도 된다.)

 

train_create_noisy = np.random.normal(0.0, 1.0, x_train.shape)

test_create_noisy = np.random.normal(0.0, 1.0, x_test.shape)

train_noisy = np.clip(x_train+train_create_noisy*0.4,0.,1.)

test_noisy = np.clip(x_test+test_create_noisy*0.4,0.,1.)

 

이번에는 이미지의 노이즈를 추가하는 과정이다

np.random.normal로 트레인과 테스트 크기에 맞혀 0 ~ 1사이의 랜덤 값을 생성을 한다

np.clip이라는 넘파이 함수를 이용하여 노이즈를 추가한다

 

 

[상식!]

np.clip(a,a_min,a_max)은 a, a_min,a_max로 구성되어 있다.

a -> 클립 할 배열의 나타낸다.

a_min -> 클립 할 최소의 값을 나타내고 해당 값보다 미만일 때는 해당 값으로 치환

a_max -> 클립 할 최대의 값을 나타내고 해당 값보다 초과일 때는 해당 값으로 치환

 

 

 

 

이미지를 확인 했을 때 노이즈가 정상적으로 생성된 것을 확인 할 수 가 있다

 

input_layer = layers.Input(shape=(28,28,1)) 
Encoding = layers.Conv2D(64,(2,2),strides=(2,2), padding='same',activation='relu')(input_layer)
Encoding = layers.MaxPooling2D((1, 1), padding='same')(Encoding)
Encoding = layers.Conv2D(32,(2,2),strides=(2,2), padding='same',activation='relu')(Encoding)
Decoding = layers.Conv2DTranspose(32,(2,2),strides=(2,2), padding='same',activation='relu')(Encoding)
Decoding = layers.Conv2DTranspose(1,(2,2),strides=(2,2), padding='same',activation='sigmoid')(Decoding)
autoencoder = models.Model(input_layer,Decoding)

 

이번에는 CAE의 모델을 만들어보자

 

Conv2D를 사용하였기 때문에 3차원을 입력 받는 것을 알 수 가 있다.

순항신경만과 다르게 CNN은 스트라이드(strides)를 사용하여 이미지 크기를 압축 할 수 가 있다.

이미지이의 최소인 7x7 형태까지 줄이게 된다.

 

Conv2DTranpose라는 CNN 업샘플링 코드를 사용하여 이미지를 원복시킨다.

 

autoencoder.compile(loss='binary_crossentropy',optimizer='adam')


autoencoder.fit(train_noisy,x_train,epochs=20,shuffle=True,validation_data=(test_noisy,x_test))

 

컴파일에서 달라진 점은 없고, 학습시킬 때 노이즈가 있는 이미지를 x의 값으로 사용하고, 없는 원래의 데이터를 y의 값으로 사용하였다.

 

 

 

이번에는 원본이미지와 예측된 이미지와 비교를 해보자

아래 이미지를 보게되면 노이즈 제거되어 거의 없는 모습을 볼 수가 있다

 

이처럼 AE는 노이즈제거를 할 때 많이 사용된다.

 

 

 

 


작성자 김강빈 kkb08190819@gmail.com / 이원재 ondslee0808@gmail.com