2024.02.20
AE : Auto Encoder
- 모델의 기본적인 구조가 대칭형이다.
- 입력: 인코더(데이터를 숫자로 변경)
- 출력: 디코더(숫자로 변경된 것을 원본으로 복원)
- (한글) utf-8 인코딩 ⇒ utf-8디코딩
AE 기본 개념
- 대칭적인 구조를 활용을 해서 근원적인 특징을 생각할 수 있다.
- 대칭적인 부분을 통해 생성이나 복원 등의 분야에서 활용 가능하다
- 데이터에서 근원적인 값으로 변경을 ‘인코더’,
- 근원적인 값에서 데이터로 변경 양식을 ‘디코더’라고 함
- 인코더/디코더 다 각각 네트워크다.
- 필요에 따라서 네트워크 구조가 변경 할 수 있다.
실습
기본세팅
MNIST 데이터 셋을 가져온다. (손글씨 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
# 이미지 데이터 출력
plt.imshow(train_X[0], cmap="gray")
plt.colorbar()
1. Dense 중심 구성 AE 모델
# 인코더 : 받을 수 있는 dense, 노드 784
# 잠재 벡터 : 64개 노드
# 디코더 : 줄여지기 전의 근원인 784개의 값으로 복원!!!!!
# 출력 : 28/28 이미지로 변경을 해서
# 데이터 셋
train_X = train_X.reshape(-1, 28*28) # (60000, 764)
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")
]
)
model.compile( optimizer=tf.optimizers.Adam(), loss="mse")
# 학습
model.fit(train_X, train_X, epochs = 20, batch_size = 256)
#---------------------------------------------------------#
# Test를 통해서 변경된 이미지를 확인
rand_text = [100,1000,5000,8987] # 4가지 랜덤 값
plt.figure(figsize=(4,8))
for idx in range(4): # 0~3까지
# test 입력
plt.subplot(4,2,idx*2+1)
select_idx = rand_index[idx]
plt.imshow( test_X[select_idx].reshape(28,28), cmap="gray")
#plt.axis("off")
# test를 모델에 적용한 결과 출력
plt.subplot(4,2,idx*2+2)
img = model.predict(np.expand_dims( test_X[select_idx], axis=0) )
plt.imshow(img.reshape(28,28), cmap="gray")
2. Conv 중심 구성 AE 모델
## 모델의 기본적인 구조
# 입력 : 1장에 대해서 3차원으로 명시
# Conv을 2번사용하여 특징 추출
# 1: 필터 32개, 사이즈2(너무 해상도가 작아서), strides=(2,2)
# 2: 필터 64개, 사이즈2(너무 해상도가 작아서), strides=(2,2)
# Flatten (2D를 1D로 바꾸는 역할만 함, 가중치 적용 안되어있음)
# Dense : 64개 노드
# ConvTranspose 2번 사용
# 출력
# 입력 데이터의 모양 변환
train_X = train_X.reshape(-1, 28,28, 1)
test_X = test_X.reshape(-1, 28,28, 1)
model = tf.keras.Sequential(
[
tf.keras.layers.Conv2D(input_shape=(28,28,1), filters=32,
kernel_size =2, strides=(2,2), activation='relu'),
tf.keras.layers.Conv2D(filters=32, kernel_size =2, strides=(2,2), activation='relu'),
tf.keras.layers.Flatten(), # 뒤에 원하는 잠재벡터
tf.keras.layers.Dense(units= 64, activation='relu'),
tf.keras.layers.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"),
tf.keras.layers.Conv2DTranspose(filters=32, 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)
3. 모델 개선
모델2 분석 결과
- Conv 중심 모델이 Dense 중심 모델보다 선명해졌으나 중간중간 픽셀의 값이 0으로 계산되어서 끊어지는 모양 발생(바로 위의 모델2 이미지 결과 참조)
- 개선사항1: Relu로 인해 0 이하 값의 loss가 일어나는 것으로 예상되어 relu대신 elu를 적용
개선사항1 분석 결과
- elu로 인해 픽셀들이 살아나는 경향을 보이나 상하좌우 끝부분이 조금씩 잘리게 나타남. 디코더 쪽에서 확장하는 과정에서 짤리는 것으로 예상됨
- 개선사항2. 디코더 부분을 padding을 사용해서 크기를 유지하면서 확대하는 방식으로 수정
개선사항1 + 2 적용 코드
model = tf.keras.Sequential(
[
tf.keras.layers.Conv2D(input_shape=(28,28,1), filters=32,
kernel_size =2, strides=(2,2), activation='elu'),
tf.keras.layers.Conv2D(filters=32, kernel_size =2, strides=(2,2), activation='elu'),
tf.keras.layers.Flatten(), # 뒤에 원하는 잠재벡터
tf.keras.layers.Dense(units= 64, activation='elu'),
tf.keras.layers.Dense(units=7*7*64, activation='elu'),
tf.keras.layers.Reshape(target_shape(7,7,64)),
tf.keras.layers.Conv2DTranspose(filters=32, kernel_size=2, strides=(2,2),
activation="elu", padding="same"),
tf.keras.layers.Conv2DTranspose(filters=32, kernel_size=2, strides(2,2),
activation='sigmoid', padding="same")
]
)
model.compile( optimizer = tf.optimizers.Adam(), loss="mse")
model.fit(train_X, train_X, epochs=20, batch_size= 256)
'ASAC 빅데이터전문가과정 > DL' 카테고리의 다른 글
ASAC 57일차_딥러닝 11일차 (0) | 2024.09.05 |
---|---|
ASAC 56일차_딥러닝 10일차 (5) | 2024.09.05 |
ASAC 54일차_딥러닝 8일차 (0) | 2024.09.04 |
ASAC 52일차_딥러닝 7일차 (0) | 2024.09.02 |
ASAC 51일차_딥러닝 6일차 (0) | 2024.09.02 |