28X28 사이즈 MNIST 데이타 X를 읽어 들여 1X784 사이즈로 일차원 화된 매트릭스로 변환한 다음 마지막에 하나의 요소를 추가하여 1X785 로 만든다. 마지막 요소에는 편향(바이아스) 용으로 1을 입력해 둔다.
웨이트 매트릭스 W는 바이아스를 별도로 처리할 필요 없이 785X10으로 처리한다. 연산 결과 10 비트 hypothesis states 에 각 비트별로 빈도수가 계산된다. Normalization 과정을 통해 softmax 확률이 계산된다.
선형 파트만을 사용하는 softmax MNIST 데이타 분석의 결과는 learning rate = 0.1, 20,000회 학습에 최대 92.5% 안팎의 인식율을 보여준다. 인식율을 개선하기 위해 Covariance를 정식화 하여 포함시키면 다음의 공식이 얻어진다.
위 식의 유도과정은 볼츠만 분포에서 볼츠만 엔트로피를 최대화하는 조건에 대하여 확률 분포의 합이 1.0 이 되는 조건과 에너지의 평균 기대 값이 일정하다는 조건을 사용하듯이 에너지를 hypothesis 로 대체하여 유도가 가능하다. 단 여기서는 볼츠만 엔트피 또는 Shannon 의 엔트로피에 대해서 hypothesis의 평균 기대 값이 일정하다는 조건 외에도 Covariance 기댓값이 일정하다는 통계학적인 구속조건을 추가하면 된다.
이 Covarince 항이 포함된 softmax classifier 사용 시 learning rate = 0.08, alpha=0.2, 20000회 학습 조건하에서 95.5∼96.0% 까지의 인식률을 보여준다.
즉 하나의 입력 데이터를 사용하면서 2세트의 랜덤 데이터를 추가로 발생 시켜 2개의 랜덤 변수를 준비하면 Covariance를 계산할 수 있다. Linear 한 파트 외에 이 Covariance 조건을 추가하면서 도입되는 상수 α는 수치계산을 통해서 가장 높은 인식률을 보여 주게 되는 값을 택하도록 한다. 위 그림을 참조하면 α값이 0.12에서 0.2 사이임을 알 수 있다.
이미 CNN을 사용한 인식율이 99% 이므로 96% 인식율이 그다지 높은 것은 아니자만 통계학적인 관점에서 Covariance 항 하나를 도입하여 3% 이상 인식율을 높일 수 있다는 점에 주목한다. 아울러 MNIST 외에도 XOR 로직문제에도 적용이 가능한데 이는 별도로 게시할 계획이다.
첨부된 코드를 다운 받아 실행해 보자.
#covariance_mnist_01.py
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
alpha = 0.0
learning_rate = 0.08
learning_num = 20000
for n in range(0, 20):
x = tf.placeholder(tf.float32, [None, 784])
W1 = tf.Variable(tf.random_normal([784, 10], stddev=0.01))
b1 = tf.Variable(tf.random_normal([10], stddev=0.01))
W2 = tf.Variable(tf.random_normal([784, 10], stddev=0.01))
b2 = tf.Variable(tf.random_normal([10], stddev=0.01))
W3 = tf.Variable(tf.random_normal([784, 10], stddev=0.01))
b3 = tf.Variable(tf.random_normal([10], stddev=0.01))
hypothesis= tf.matmul(x, W1) + b1 + alpha*(tf.matmul(x, W2) + b2)*(tf.matmul(x, W3) + b3)
y = tf.nn.softmax(hypothesis)
y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(learning_rate =learning_rate).minimize(cross_entropy)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
for i in range(learning_num):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print('case=:', n,'alpha=:%.2f', alpha, ' lr=:', learning_rate)
print('accuracy=:',sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
alpha = alpha - 0.02
if n > 10:
learning_rate = 0.05
'머신러닝' 카테고리의 다른 글
1-2 라즈베리 파이 TensorFlow 모듈응용 Computational Graph 상수 덧셈 예제 (0) | 2017.12.05 |
---|---|
1-1 라즈베리 파이 구글 인공지능 머신러닝 지원 TensorFlow 모듈 설치 및 시험 (0) | 2017.12.05 |
Statistical softmaxt 텐서플로우 응용 코드: iris_alpha_01.py (0) | 2012.02.03 |
Iris_lda_Classifiers_01.py 코드 (0) | 2012.02.02 |
ch_03.py (0) | 2012.01.23 |