[Deep Learning] Auto-Encoder
Auto-Encoder
오토인코더(Autoencoder)는 단순히 입력을 출력으로 복사하는 신경망이다.
모델은 아래와 같다. 윗부분이 input, 아랫부분이 output이다.
사이의 파란선 부분은 encoder, 빨간선 부분은 Decoder이다.
input = output으로 만들어주어야한다.
Auto-encoder의 4가지 특징
- Data Compression 데이터 압축
- Data Visualization 데이터 가시화
- Curse of dimensionality 차원의 저주 해결 : 우리는 고차원에서 일어나는 문제점을 알 수 없다. 다라서 고차원에 맞게 data mapping을 하려면 많은 data가 필요하다.
- Discovering most important features 가장 중요한 피쳐 찾기 : autoencoder를 통해 이 data의 중요한 피쳐를 찾을 수 있다.
Auto-encoder Code
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
#to ignore computer error
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)
#한 스텝당 얼마나 학습시킬지
batch_size = 100
#학습 반영률
learning_rate = 0.01
#현재 data를 얼마나 반복할지
epoch_num = 20
#MNIST image data 차원
n_input = 28*28
#input data를 얼마의 차원으로 바꿀것인가
n_hidden = 256
X = tf.placeholder(tf.float32, [None, n_input])
W_encode = tf.Variable(tf.random_uniform([n_input, n_hidden], -1., 1.))
b_encode = tf.Variable(tf.random_uniform([n_hidden], -1., 1.))
encoder = tf.nn.sigmoid(tf.add(tf.matmul(X, W_encode), b_encode))
W_decode = tf.Variable(tf.random_uniform([n_hidden, n_input], -1., 1.))
b_decode = tf.Variable(tf.random_uniform([n_input], -1., 1.))
decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, W_decode), b_decode))
cost = tf.reduce_mean(tf.square(X - decoder))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
total_batch = int(mnist.train.num_examples/batch_size)
for epoch in range(epoch_num):
avg_cost = 0
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
_, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs})
avg_cost += cost_val / total_batch
print('Epoch:', '%d' % (epoch+1), 'cost:', '{:.9f}'. format(avg_cost))
samples = sess.run(decoder, feed_dict={X: mnist.test.images[:10]})
fig, ax = plt.subplots(2, 10, figsize=(10, 2))
for i in range(10):
ax[0][i].set_axis_off()
ax[1][i].set_axis_off()
ax[0][i].imshow(np.reshape(mnist.test.images[i], (28,28)))
ax[1][i].imshow(np.reshape(samples[i], (28, 28)))
plt.show()
Stacked Auto-Encoder model
Stacked Auto-Encoder란 여러개의 Hidden Layer를 가지는 auto-encoder를 말한다. Hidden Layer를 기준으로 대칭이다.
Stacked Auto-encoder Code
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
#to ignore computer error
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)
#한 스텝당 얼마나 학습시킬지
batch_size = 100
#학습 반영률
learning_rate = 0.01
#현재 data를 얼마나 반복할지
epoch_num = 20
#MNIST image data 차원
n_input = 28*28
#input data를 얼마의 차원으로 바꿀것인가
n_hidden1 = 256
n_hidden2 = 128
X = tf.placeholder(tf.float32, [None, n_input])
W_encode1 = tf.Variable(tf.random_uniform([n_input, n_hidden1], -1., 1.))
b_encode1 = tf.Variable(tf.random_uniform([n_hidden1], -1., 1.))
encoder_h1 = tf.nn.sigmoid(tf.add(tf.matmul(X, W_encode1), b_encode1))
W_encode2 = tf.Variable(tf.random_uniform([n_hidden1, n_hidden2], -1., 1.))
b_encode2 = tf.Variable(tf.random_uniform([n_hidden2], -1., 1.))
encoder_h2 = tf.nn.sigmoid(tf.add(tf.matmul(encoder_h1, W_encode2), b_encode2))
W_decode1 = tf.Variable(tf.random_uniform([n_hidden2, n_hidden1], -1., 1.))
b_decode1 = tf.Variable(tf.random_uniform([n_hidden1], -1., 1.))
decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder_h2, W_decode1), b_decode1))
W_decode2 = tf.Variable(tf.random_uniform([n_hidden1, n_input], -1., 1.))
b_decode2 = tf.Variable(tf.random_uniform([n_input], -1., 1.))
output = tf.nn.sigmoid(tf.add(tf.matmul(decoder, W_decode2), b_decode2))
cost = tf.reduce_mean(tf.square(X - output))
optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
total_batch = int(mnist.train.num_examples/batch_size)
for epoch in range(epoch_num):
avg_cost = 0
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
_, cost_val = sess.run([optimizer, cost], feed_dict={X: batch_xs})
avg_cost += cost_val / total_batch
print('Epoch:', '%d' % (epoch+1), 'cost:', '{:.9f}'. format(avg_cost))
samples = sess.run(output, feed_dict={X: mnist.test.images[:10]})
fig, ax = plt.subplots(2, 10, figsize=(10, 2))
for i in range(10):
ax[0][i].set_axis_off()
ax[1][i].set_axis_off()
ax[0][i].imshow(np.reshape(mnist.test.images[i], (28,28)))
ax[1][i].imshow(np.reshape(samples[i], (28,28)))
plt.show()
Denoising Auto-Encoder model
입력에 노이즈(noise, 잡음)를 추가하고, 노이즈가 없는 원본 입력을 재구성하도록 학습시키는 모델이다.
#random nosie 생성
batch_x_noisy = batch_x + random noise
#학습
feed_dict={X:batch_x_noise}
sess.run(optimizer, feed_dict=feed_dict)
728x90
반응형
'CS > Deep Learning' 카테고리의 다른 글
[Deep Learning] 합성곱 신경망 (Convolution Neural Network, CNN) (0) | 2020.05.12 |
---|---|
[Deep Learning] 가중치 초기화 & Check Point (0) | 2020.05.11 |
[Deep Learning] Optimizer (1) | 2020.04.19 |
[Deep Learning] Dropout (0) | 2020.04.19 |
[Deep Learning] Regularization (0) | 2020.04.19 |