AE(Auto_Encoder)

AE의 원리

  • 히든층을 입력층보다 작은 값을 입력하고, 압축(인코더)과 복원(디코더)을 통해 이미지를 생성
  • encoder와 decoder로 구성
  • 이 과정에서 만들어야 할 것 (데이터 정제 -> 인코더-> 디코더 -> 컴파일, 학습 -> 테스트)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D, Flatten, Reshape
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

(X_train, _), (X_test, _) = mnist.load_data() #mnist데이터를 가지고 작업(x_train으로 학습, x_test로 평가)

# 데이터 x,28,28,1 차원으로 변경 후 nomalization 해줌(/255)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32') / 255

# 인코더 생성(출력 차원은 임의로 바꿔도 되며, 압축(차원을 줄임) -> 복원(차원을 늘림)이 포인트입니다.)
autoencoder = Sequential()
autoencoder.add(Conv2D(16, kernel_size = 3, input_shape = X_train.shape[1:], activation='relu', padding = 'same'))
# ,28,28,16
autoencoder.add(MaxPooling2D(2, padding='same'))
# ,14,14,16
autoencoder.add(Conv2D(8, kernel_size =3, activation = 'relu', padding = 'same'))
# ,14,14,8
autoencoder.add(MaxPooling2D(2, padding='same'))
# , 7,7,8
autoencoder.add(Conv2D(8, kernel_size = 3, strides =2, padding= 'same', activation = 'relu'))
# , 4,4,8 (strides가 2이기때문)


# 인코더에 바로 디코더를 추가 생성함!
# 디코더 생성
autoencoder.add(UpSampling2D())
# , 8,8,8
autoencoder.add(Conv2D(8, kernel_size=3, padding='same', activation='relu'))
# , 8,8,8
autoencoder.add(UpSampling2D())
# ,16,16,8
autoencoder.add(Conv2D(16, kernel_size=3, activation='relu'))#no padding option
# ,14,14,16
autoencoder.add(UpSampling2D())
# ,28,28,16
autoencoder.add(Conv2D(1, kernel_size = 3, padding='same', activation='sigmoid'))
# ,28,28,1

# 컴파일 및 학습을 하는 부분입니다.
with tf.device("/GPU:0"): #GPU가 있을 경우 0번 GPU를 사용하여 학습
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=20, batch_size=128, validation_data=(X_test, X_test))

# 원본 이미지와 AE로 생성된 이미지 비교
random_test = np.random.randint(X_test.shape[0], size=5)
ae_imgs = autoencoder.predict(X_test)
plt.figure(figsize=(7,2)) #사이즈 설정

for i, image_idx in enumerate(random_test):
ax = plt.subplot(2,7, i+1)
plt.imshow(X_test[image_idx].reshape(28,28))
ax = plt.subplot(2,7, 7+i+1)
plt.imshow(ae_imgs[image_idx].reshape(28,28))
  • 첫번째 줄이 원본 이미지
    아래줄이 AE로 생성된 이미지

결과물 이미지

Author

InhwanCho

Posted on

2022-12-21

Updated on

2022-12-21

Licensed under

Comments