⚙️ AutoEncoder
📌 AutoEncoder
- 기본 아이디어 : 대칭 구조를 활용하면 근원적인 특징을 생각할 수 있다.
- 과정 : 대칭적인 부분을 통해 생성 / 복원을 진행한다.
- 구성요소
- 인코더 : 데이터 -> 근원적인 값 변환
- 디코더 : 근원적인 값 -> 데이터 변환
- 인코더, 디코더 모두 각각의 네트워크이며, 필요에 따라 구조 변경이 가능하다.
📌 기본 Dense 중심으로 구성된 AE 모델
- 모델의 구조
- 인코더 : 입력 받을 수 있는 dense, 노드 784개
- 잠재 벡터 : 64개 노드
- 디코더 : 줄여지기 전 784개 값으로 복원
- 출력 : 28*28으로 변경된 이미지
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
(train_X, train_y), (test_X, test_y) = tf.keras.datasets.mnist.load_data()
train_X = train_X / 255.0
test_X = test_X / 255.0
train_X = train_X.reshape(-1, 28*28)
test_X = test_X.reshape(-1, 28*28)
from tensorflow.keras.layers import Dense, Conv2D
model = tf.keras.Sequential(
[
Dense(input_shape = (28*28, ), units = 784, activation = "relu"),
Dense(units = 64, activation = "relu"),
Dense(units = 784, activation = "relu")
]
)
# Why MSE? : 원복 픽셀의 값하고 최대한 같아야 하기 때문
model.compile(optimizer = tf.optimizers.Adam(), loss = "mse")
model.fit(train_X, train_X, epochs = 20, batch_size = 256)
📌 Conv 중심으로 구성된 AE 모델
- 모델의 구조
- 입력 : 이미지를 3차원으로 명시
- Conv1 : 필터 32개, 사이즈 2, strides = (2,2)
- Conv2 : 필터 64개, 사이즈 2, strides = (2,2)
- Flatten : 2차원 -> 1차원
- Dense : 64개 노드
- ConvTranspose
- ConvTranspose
- 출력
train_X = train_X.reshape(-1,28,28,1)
test_X = test_X.reshape(-1,28,28,1)
model = tf.keras.Sequential(
[
Conv2D(input_shape = (28,28,1), filters = 32, kernel_size = 2, strides = (2,2), activation = "relu"),
Conv2D(filters = 64, kernel_size = 2, strides = (2,2), activation = "relu"),
tf.keras.layers.Flatten(),
Dense(units = 64, activation = "relu"),
Dense(units = 7*7*64, activation = "relu"),
tf.keras.layers.Reshape(target_shape = (7,7,64)),
tf.keras.layers.Conv2DTranspose(filters = 32, kernel_size = 2, strides = (2,2), activation = "relu"),
# 입력 데이터의 개별 픽셀 값을 정규화하여 0~1로 제한하였기 때문에,
tf.keras.layers.Conv2DTranspose(filters = 1, kernel_size = 2, strides = (2,2), activation = "sigmoid")
]
)
model.compile(optimizer = tf.optimizers.Adam(), loss = "mse")
model.fit(train_X, train_X, epochs = 20, batch_size = 256)