[Deep Learning] Auto-Encoder
CS/Deep Learning

[Deep Learning] Auto-Encoder

[Deep Learning] Auto-Encoder

 

Auto-Encoder

오토인코더(Autoencoder)는 단순히 입력을 출력으로 복사하는 신경망이다.

모델은 아래와 같다. 윗부분이 input, 아랫부분이 output이다.

사이의 파란선 부분은 encoder, 빨간선 부분은 Decoder이다.

input = output으로 만들어주어야한다.

 

Auto-encoder model

 


Auto-encoder의 4가지 특징

  1. Data Compression 데이터 압축

  1. Data Visualization 데이터 가시화
  2. Curse of dimensionality 차원의 저주 해결 : 우리는 고차원에서 일어나는 문제점을 알 수 없다. 다라서 고차원에 맞게 data mapping을 하려면 많은 data가 필요하다.
  3. 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()

 

auto-encoder 출력 결과

 


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()

 

Stacked Auto-encoder 출력 결과

 


Denoising Auto-Encoder model

입력에 노이즈(noise, 잡음)를 추가하고, 노이즈가 없는 원본 입력을 재구성하도록 학습시키는 모델이다.

Denoising Auto-Encoder model

#random nosie 생성
batch_x_noisy = batch_x + random noise

#학습
feed_dict={X:batch_x_noise}
sess.run(optimizer, feed_dict=feed_dict)

 

728x90
반응형