더북(TheBook)

그림 19-7을 보면 입력한 이미지와 똑같은 크기로 출력층을 만들었습니다. 그리고 입력층보다 적은 수의 노드를 가진 은닉층을 중간에 넣어서 차원을 줄여 줍니다. 이때 소실된 데이터를 복원하기 위해 학습을 시작하고, 이 과정을 통해 입력 데이터의 특징을 효율적으로 응축한 새로운 출력이 나오는 원리입니다.

가장 핵심이 되는 인코딩과 디코딩 과정을 코딩해 보면 다음과 같습니다.

# 생성자 모델 만들기
autoencoder = Sequential()

# 인코딩 부분
autoencoder.add(Conv2D(16, kernel_size=3, padding='same', input_shape=(28, 
28,1), activation='relu')) ----- ➊
autoencoder.add(MaxPooling2D(pool_size=2, padding='same')) ----- ➋
autoencoder.add(Conv2D(8, kernel_size=3, activation='relu', padding='same')) ----- ➌
autoencoder.add(MaxPooling2D(pool_size=2, padding='same')) ----- ➍
autoencoder.add(Conv2D(8, kernel_size=3, strides=2, padding='same', 
activation='relu')) ----- ➎

# 디코딩 부분
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', 
activation='relu')) ----- ➏ autoencoder.add(UpSampling2D()) ----- ➐ autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu')) ----- ➑ autoencoder.add(UpSampling2D()) ----- ➒ autoencoder.add(Conv2D(16, kernel_size=3, activation='relu')) ----- ➓

autoencoder.add(UpSampling2D()) -----

autoencoder.add(Conv2D(1, kernel_size=3, padding='same', activation='sigmoid')) -----

 

# 전체 구조 확인

autoencoder.summary() -----

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.