2-8 Rosenblatt Perceptron N = 2 TensorFlow Softmax 머신 러닝 확률 분석
Rosenblatt 의 퍼셉트론에 있어서 웨이트 벡터 업데이트를 중심으로 하는 알고리듬이 문제가 없다는 점은 확인이 되었으나 지금의 머신러닝 이해와는 많이 동 떨어진 면이 있다. 머신 러닝 결과 차원에서는 Rosenblatt이나 TensorFlow와 마찬가지로 학습한대로 제대로 라벨 값이 얻어지느냐의 문제이다.
Rosenblatt 퍼셉트론의 N = 2 문제도 이러한 관점에서 재조명해 보기로 하자. 지난번 논의에서 조도센서 2개로 입력 벡터 (X1, X2)를 생성하였다.
2-4 Rosenblatt의 퍼셉트론 알고리듬 N=1, N=2
https://steemit.com/kr/@codingart/2-4-rosenblatt-n-1-n-2
각 입력 벡터 성분은 조도센서에 쪼여 주는 빛의 밝기에 따라 밝으면 B(bright) 어두우면 D(dark)가 된다. 따라서 2개의 조도센서로부터 얻어질 수 있는 입력 벡터는 BB,BD,DB,DD 4가지 경우가 있을 수 있으나 라벨 값은 2가지에 한정된다. 아래와 같이 표를 예를 들어 보자.
지난번 표에서 숫자 크기를 변경하도록 한다. 즉 BB에서 (0.7, 0.6)을 (1.0, 1.0) 으로 변경하자. 실제 조도센서 실험을 해보면 센서 품질이 균일해서 햇빛 하에 거의 90% 에 달하는 값을 아날로그 핀으로 읽을 수 있었으며 100%도 현실적으로 가능한듯하다. 아울러 어둠 데이터도 거의 (0.3, 0.1)에서 (0.0, 0.0) 으로 주도록 하자.
2개의 조도센서에서 얻어질 수 있는 센서 데이터의 현실성을 확보하기 위해서는 예를 들면 하나는 건물 앞 하나는 건물 뒤에 설치하게 되면 BD 나 DB 와 같은 데이터가 얻어질 가능성이 있다.
BB 이거나 DD이면 라벨 값을 각각 +1과 –1로 부여하면 된다. 그렇다면 BD 또는 DB 와 같이 애매한 경우는 어떻게 처리할 것인가? 분류 결과는 단 2종류 +1과 –1밖에 없는데 어떤 기준을 적용할 것인가?
이 문제를 해결하기 위해서 (X1, X2) 평면 상에서 입력 벡터들을 2종류로 분류할 수 있는 적절한 classifier 가 있다면 편리할뿐더러 애매한 상태의 조합 BD 와 DB 가 과연 어느 쪽에 속하는지 학습된 결과로부터 테스트를 거쳐 라벨 값을 부여 할 수 있을 것이다.
TensorFlow Softmax 계산 결과에 의하면 커버 페이지 그림에서처럼 확률값이 매번 계산 때마다 변동하고 있으나 라벨 값은 생각대로 유지가 된다. 여러번 실행해 보도록 한다. 한번씩 오류라고 판단되는 경우도 나올 수 있다. 확률에 의한 판단이므로 여러번 나온 경우가 더욱 확률적으로 믿을만 할 것이다. 학습 데이터 수가 적은게 그러한 영향을 미치지 않나 한다.
(1.0)에서 (0,1)까지 대략적인 분류선(classifier)을 그어 보았다. (0.5, 0.5) 가 선에 걸려 있는데 밝음 영역이 생각보다 조금 더 넓은 듯하다. (0.4, 0.4) 라든지 분류선 근처에서 인간은 분류가 어려우나 머신 러닝은 기계학습의 결과에 따라 판단을 내려 준다.
아래의 코드를 복사해서 실행할 경우 혹 indentation 이 잘못되어 에러가 검출되면 2018년 8월 10일의 AS 내용을 참조하기 바란다. indentation 위치 AS 꼭 보시고 수정작업하세요.
#softmax_classifier_4data_rosenblattN2_01
#Softmax Classifier
import tensorflow as tf
tf.set_random_seed(777) # for reproducibility
x_data = [[0.0, 0.0], [1.0, 1.0]]
y_data = [[1, 0],[0, 1]]
X = tf.placeholder("float", [None, 2])
Y = tf.placeholder("float", [None, 2])
nb_classes = 2
W = tf.Variable(tf.random_normal([2, nb_classes]), name='weight')
b = tf.Variable(tf.random_normal([nb_classes]), name='bias')
#tf.nn.softmax computes softmax activations
#softmax = exp(logits) / reduce_sum(exp(logits), dim)
hypothesis = tf.nn.softmax(tf.matmul(X, W) + b)
#Cross entropy cost/loss
cost = tf.reduce_mean(-tf.reduce_sum(Y * tf.log(hypothesis), axis=1))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
#Launch graph
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for step in range(4001):
sess.run(optimizer, feed_dict={X: x_data, Y: y_data})
if step % 200 == 0:
print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}))
print('--------------')
# Testing & One-hot encoding
a = sess.run(hypothesis, feed_dict={X: [[0.7, 0.1]]})
print(a, sess.run(tf.argmax(a, 1)))
print('--------------')
b = sess.run(hypothesis, feed_dict={X: [[0.2, 0.9]]})
print(b, sess.run(tf.argmax(b, 1)))
print('--------------')
c = sess.run(hypothesis, feed_dict={X: [[0.4, 0.4]]})
print(c, sess.run(tf.argmax(c, 1)))
print('--------------')
d = sess.run(hypothesis, feed_dict={X: [[0.5, 0.5]]})
print(d, sess.run(tf.argmax(d, 1)))
print('--------------')
all = sess.run(hypothesis, feed_dict={
X: [[0.7, 0.1],[0.2, 0.9],[0.4,0.4],[0.5, 0.5]]})
print(all, sess.run(tf.argmax(all, 1)))
즐거운 스팀잇 생활하시나요?
무더위야 가라!!!!