@markdown
# 비지도 학습 - 오토인코더(Autoencoder)
<br/>
## 비지도 학습(Unsupervised Learning)
____
- 데이터에 대한 레이블(Label) 명시적인 정답이 주어지지 않은 상태에서 컴퓨터를 학습시키는 방법론
- 특정 Input에 대하여 올바른 정답이 없는 데이터 집합이 주어지는 경우의 학습
- 데이터안에서 어떤 관계를 찾아내는데 목적이 있음
<br/>
## 비지도 학습 방법
____
- 데이터의 형태, 분포로 학습을 진행
- 비지도 학습은 데이터의 숨겨진 특징이나 구조를 발견하는데 사용됨
- 예) 주어진 입력과 X와 비슷한 입력들의 군집을 추정해내는 것
- 종류 : Clustering, K means, Expectation maximization
<br/>
## 오토인코더(Autoencoder)
____
- 비지도 학습 방법론에서 주로 사용 되는 구조
- 출력값을 입력값의 근사로 하는 함수를 학습함
- 인코더를 통해 입력 데이터에 대한 특징을 추출하고, 디코더를 통해 원본 데이터를 재구성하는 학습방식
![](https://upload.wikimedia.org/wikipedia/commons/thumb/2/28/Autoencoder_structure.png/350px-Autoencoder_structure.png)
- 뉴럴 네트워크 두개를 뒤집어 붙여놓은 형태
- 종류 : Variational Autoencoder, Denoising Autoencoder
<br/>
## 오토 인코더의 원리
____
- 인코딩 과정에서 입력된 데이터의 핵심 Feature 정보만 Hidden Layer에서 학습하고, 나머지 정보는 손실시킴
- 디코딩 과정에서 Hidden Layer의 출력값을 뽑았을 때 완벽한 값 복사가 아닌 입력값의 근사치가 됨
- 출력값이 입력값과 최대한 같아지도록 튜닝함으로써, Feature를 잘 추출할 수 있게 하는 것이 오토인코더의 원리(입력값과 출력값이 최대한 비슷하게 만드는 가중치를 찾아냄)
<br/>
## 오토 인코더의 학습 과정
____
- 1. 입력값과 Hidden Layer의 가중치를 계산해 Sigmoid 함수를 통과시킨다.
- 2. 1번의 결과물과 출력 레이어의 가중치를 계산해 Sigmoid 함수를 통과시킨다.
- 3. 2번의 값을 이용해 MSE(Mean Squared Error)를 계산한다.
- 4. 3번의 결과로 나온 Loss 값을 SGD로 최적화
- 5. 오류역전파를 사용하여 가중치를 갱신
<br/>
## 오토 인코더 MNIST 예제
____
- MNIST 숫자 손글씨 예제 Autoencoder 구현
<pre><code class="python" style="font-size:15px">import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)
learning_rate = 0.01
training_epoch = 10
batch_size = 100
n_hidden = 256
n_input = 28*28
# 비지도 학습이므로 Y값이 없다
X = tf.placeholder(tf.float32, [None, n_input])
# 인코더
W_encode = tf.Variable(tf.random_normal([n_input, n_hidden]))
b_encode = tf.Variable(tf.random_normal([n_hidden]))
encoder = tf.nn.sigmoid(tf.add(tf.matmul(X, W_encode), b_encode))
# 디코더
W_decode = tf.Variable(tf.random_normal([n_hidden, n_input]))
b_decode = tf.Variable(tf.random_normal([n_input]))
decoder = tf.nn.sigmoid(tf.add(tf.matmul(encoder, W_decode), b_decode))
cost = tf.reduce_mean(tf.pow(X - decoder, 2))
optimizer = tf.train.RMSPropOptimizer(learning_rate).minimize(cost)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
total_batch = int(mnist.train.num_examples / batch_size)
for epoch in range(training_epoch):
total_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})
total_cost += cost_val
print('Epoch: ', '%04d' % (epoch + 1), 'Avg. cost=', '{:4f}'.format(total_cost / total_batch))
sample_size = 5
samples = sess.run(decoder, feed_dict={X: mnist.test.images[:sample_size]})
fig, ax = plt.subplots(2, sample_size, figsize=(sample_size, 2))
for i in range(sample_size):
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()
</code></pre>
<br/>
### 학습 결과
![](https://user-images.githubusercontent.com/12658717/40586199-14749dd4-61fa-11e8-94d9-8118969ab2d2.png)
> 소스 출처 : 3분 딥러닝 텐서플로맛([https://github.com/golbin/TensorFlow-Tutorials/blob/master/08%20-%20Autoencoder/01%20-%20Autoencoder.py](https://github.com/golbin/TensorFlow-Tutorials/blob/master/08%20-%20Autoencoder/01%20-%20Autoencoder.py))
> 그림 출처 : [https://en.wikipedia.org/wiki/Autoencoder](https://en.wikipedia.org/wiki/Autoencoder)
'Deep Learning' 카테고리의 다른 글
TensorFlow - RNN 기초 (0) | 2017.08.25 |
---|---|
TensorFlow - MNIST ReLU, Xavier 초기화, Dropout 적용하여 정확도 높이기 (0) | 2017.08.15 |
TensorFlow - MNIST 데이터 셋 활용한 손 글씨 인식 모델 구현 (0) | 2017.08.07 |
TensorFlow - Neural Network XOR 문제 (4) | 2017.08.03 |
TensorFlow - Learning Rate, Data Preprocessing, Overfitting (0) | 2017.08.01 |