- 딥러닝을 이용해 가상의 이미지를 만드는, 또 하나의 유명한 알고리즘으로는 오토인코더 (Auto-Encoder, AE)가 있음
- 오토인코더는 GAN과 비슷한 결과를 만들지만, 다른 성질을 지니고 있음
- GAN이 세상에 존재하지 않는 완전한 가상의 것을 만들어 내는 반면에, 오토인코더는 입력 데이터의 특징을 효율적으로 담아낸 이미지를 생성해 냄
- 따라서 어떤 입력 데이터를 사용하는가에 따라서 생성되는 이미지의 특징이 달라지게 됨
- 오토인코더는 영상 의학 분야 등 아직 데이터 수가 충분하지 못한 분야에서 사용될 수 있음
- 오토인코더는 차원 축소 알고리즘으로도 활용될 수 있음
- 입력 층보다 적은 수의 노드를 가진 은닉층을 중간에 넣어 줌으로써 차원을 줄여 줌
- 이 때 소실된 데이터를 복원하기 위해 학습을 시작하고, 이 과정을 통해 입력 데이터의 특징을 효율적으로 응축한 새로운 출력이 나오는 원리임
- 인코더 부분만을 차원 축소 알고리즘으로 사용하기도 하며, 디코더 부분을 이미지 생성 모델로 사용함
- 오토인코더에서 입력을 재구성하는 과정을 거치기 때문에 출력을 ‘재구성(reconstruction)’이라고 표현하기도 함
- 비지도 학습의 경우, 재구성에 대한 손실 함수로는 입력 값(X)과 출력 값(X’) 사이의 제곱평균제곱근(root mean square)을 사용함
- 지도 학습의 경우, 출력 값에 대한 크로스 엔트로피 손실 함수로 학습을 함
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 matplotlib.pyplot as plt
import numpy as np
#MNIST 데이터 셋을 불러옵니다.
(X_train, _), (X_test, _) = mnist.load_data()
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, 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()
#컴파일 및 학습을 하는 부분
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs=50, batch_size=128, validation_data=(X_test, X_test))
#학습된 결과를 출력하는 부분
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.axis('off')
ax = plt.subplot(2, 7, 7 + i +1)
# 컴파일 및 학습을 하는 부분입니다.
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
autoencoder.fit(X_train, X_train, epochs-50, batch_size=128, validation_data=(X_test, X_test))
'빅데이터 분석가 양성과정 > Python - 딥러닝' 카테고리의 다른 글
전이 학습 (0) | 2024.07.18 |
---|---|
이미지 증강 (0) | 2024.07.18 |
비지도학습 신경망(GAN) (1) | 2024.07.18 |
순환신경망_재정리 및 추가 (1) | 2024.07.18 |
자연어 처리_재정리 (2) | 2024.07.18 |