[실습] Neural Net for XOR

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

X = tf.plcaholder(tf.float32)
Y = tf.placeholder(tf.float32)
W = tf.Variable(tf.random_normal([2, 1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name='bias')

#Hypothesis using sigmoid
hypothesis = tf.sigmoid(tf.matmul(X, W) + b)

#Cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

#Accuracy computation
#True if hypothesis > 0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
# 평균을 내서 정확도를 구한다. 4개 다 True면(1) 정확도는 1이다.
accuracy  = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

with tf.Session as sess:
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y:y_data})
        if step % 100 == 0:
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W))

    #Accuracy report
    h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a)

똑같은 데이터로 학습하고 테스트한다. 가설값이 0.5보다 크면 True(1), 작으면 False(0)

그러나 결과가 정확하지 않다.

Hypothesis:
[[0.5]
[0.5]
[0.5]
[0.5]]
Correct:
[[0.]
[0.]
[0.]
[0.]]
Accuracy: 0.5

이게 기존의 방법이다. 한 선을 그으면 이론적으로는 정확도가 절반 정도밖에 될 수 없다.

아래가 이 문제를 해결할 방법이다.

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

X = tf.plcaholder(tf.float32)
Y = tf.placeholder(tf.float32)

## 여기부터
W1 = tf.Variable(tf.random_normal([2, 2]), name='weight')
b1 = tf.Variable(tf.random_normal([2]), name='bias')
layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([2, 1]), name='weight2')
b2 = tf.Variable(tf.random_normal([1]), name='bias2')
layer2 = tf.sigmoid(tf.matmul(layer1, W2) + b2)

#Hypothesis using sigmoid
hypothesis = tf.sigmoid(tf.matmul(layer1, W2) + b2)
## 여기까지. 

#Cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

#Accuracy computation
#True if hypothesis > 0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
# 평균을 내서 정확도를 구한다. 4개 다 True면(1) 정확도는 1이다.
accuracy  = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

with tf.Session as sess:
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        sess.run(train, feed_dict={X: x_data, Y:y_data})
        if step % 100 == 0:
            print(step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run([W1, W2]))

    #Accuracy report
    h, c, a = sess.run([hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data})
    print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a)

Hypothesis:
[[0.013382]
[0.98166]
[0.988094]
[0.011357]]
Correct:
[[0.]
[1.]
[1.]
[0.]]
Accuracy: 1.0

아래처럼 두번째 레이어에 들어갈 값을 Wide하게 늘리면 더 정확도가 좋아진다.레이어를 늘린 경우도 더 정확도가 좋아진다.

results for ""

    No results matching ""