import tensorflow.compat.v1 as tf
import numpy as np
tf.disable_v2_behavior()
tf.set_random_seed(777) # for reproducibility
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.placeholder(tf.float32, [None, 2])
Y = tf.placeholder(tf.float32, [None, 1])
W = tf.Variable(tf.random_normal([2, 1]), name="weight")
b = tf.Variable(tf.random_normal([1]), name="bias")
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
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)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))
# Launch graph
with tf.Session() as sess:
# Initialize TensorFlow variables
sess.run(tf.global_variables_initializer())
for step in range(10001):
_, cost_val, w_val = sess.run(
[train, cost, W], feed_dict={X: x_data, Y: y_data}
)
if step % 100 == 0:
print(step, cost_val, w_val)
# 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)
이건 실습 코드고, 아래는 결과 화면
우선 XOR이 뭔지 보고 가자
다른 값이면 1이되고 같은 값이면 0이된다 라는 개념이다
모델을 학습하고 X값을 주면 Y값을 예측해보는 모델을 만들어보자 라는 거다
일단 인스턴스 데이터를 읽어와야한다
np array로 데이터를 만들자(4개밖에 안되니까!)
그럼이제 예측하는 모델을 만들자
텐서플로우로는 쉽게 가능하다
우리는 logistic regression이란걸 이용할거다.
placeholder로 X와 Y를 만들어주고
W와 b를 정해줘야 한다
x데이터에 x1 x2 두개가 있으니까 W의 첫번째에는 2라는 값을 준거고
y가 1개 값으로 나가니까 두번째에 1을 써준거다
in 이 2개, out이 1개 라고도 볼 수 있겠다
b에서의 1도 out 이고 !
이렇게 W 와 b를 우리가 정하면 hypothesis 모델을 만들 수 있다
cost도 계산을 하고, minimize를 하자
했다.
그러면 학습이 시작된다고 볼 수 있다.
학습을 하면 결과가 나올거다.
0.5보다 크면 1(True)라고 하고
0.5보다 작으면 0(False)라고 할 수 있도록 predicted를 써준다.
그리고 실제 정답이랑 같은지 아닌지를 비교하고(True, False로 나온다)
-> 정확도를 구한다(accuracy)
근데 이거,,, 돌려보면 잘 안된다
10001번을 돌렸는데도. 왜 그런걸까? (정확도가 0.5가 나온다)
뭐 이런식으로
이걸 되게 하는 방법이 Neural Net 이라고 배웠지.
레이어를 한개만 하지말고 두개를 붙여서 하면 해결할 수 있다고 했다.
첫번째 레이어에서 나온 값을 두번째 곱할 값에 넣어주면 된다
오른쪽 위의 그림과 같아진거다
마지막에 출력값은 Y hat이다
주의해야 할게 하나 있는데 W의 크기를 잘 정해줘야한다는 거다
첫번째 x의 입력이 2니까 2로 했고 out도 2로 해줬다
출력은 Y의 out 이 1이니까 1로 써줌
아까랑 다르게 2단으로 바꿔줬더니 정확도가 1.0이 나오는 걸 볼 수 있다.
그러면 넓게 연결시켜볼까
이전엔 이랬다면
이런식으로..
노란색 박스에 우리가 새롭게 한건데 큰값은 더 커지고 작은값은 더 작아졌다
->학습을 더 잘했다고 할 수 있다
그러면 넓게 말고 깊게도 할 수 있겠다
역시 레이어가 많을수록 학습을 더 잘한다고 할 수 있다