2-8 Rosenblatt Perceptron N = 2 TensorFlow Softmax 머신 러닝 확률 분석

in #kr6 years ago (edited)

noname01.png

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 와 같은 데이터가 얻어질 가능성이 있다.

noname02.png

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)))
Sort:  

즐거운 스팀잇 생활하시나요?
무더위야 가라!!!!

Coin Marketplace

STEEM 0.35
TRX 0.12
JST 0.040
BTC 70557.88
ETH 3560.83
USDT 1.00
SBD 4.75