z2soo's Blog

Deep learning : XOR gate 본문

Big data & AI/AL&DL

Deep learning : XOR gate

z2soo 2020. 1. 13. 09:08
반응형

목차

  1. 모듈 삽입
  2. Data set
  3. Placeholder
  4. Weight, bias
  5. Hypothesis
  6. Cost function
  7. Train
  8. Session, 초기화
  9. 학습
  10. 예측

모듈 삽입

import tensorflow as tf

Data set

XOR gate 논리회로를 multi-layer를 사용하여 학습이 가능하다는 것을 보이고자 한다. 

따라서 사용하는 데이터는 XOR 배타적인 논리연산을 이용한다. (두 값이 다른 경우에만 값이 1)

x_data = [[0,0],
         [0,1],
         [1,0],
         [1,1]]
y_data = [[0],
         [1],
         [1],
         [0]]

Placeholder

X = tf.placeholder(shape=(None,2), dtype=tf.float32)
Y = tf.placeholder(shape=(None,1), dtype=tf.float32)

Weight, bias

multi-layer 란 여러 logistic regression 학습을 여러번 진행한다는 의미이다. 한 layer 과정에서의 logistic 갯수는 n 개로 임의로 설정 한다. layer를 많이 설정할수록 cost 값은 낮아질 수 밖에 없다. 이때, gpu를 사용하는 이유는 수치연산에 특화되어 있어 mylti-layer 과정을 보다 빠르게 진행할 수 있기 때문이다. (메트릭스 곱셈을 다 수행하는 것, 메모리 사용을 많이 함)

 

  • n : 처음 logistic의 갯수
  • layer : layer의 갯수를 늘임에 따라 W3, b3 까지 설정하면 된다.

  • W1 = tf.Variable( tf.random_normal( [ X의 열 갯수, n ] ), name = 'weight1' )
  • b1 = tf.Variable( tf.random_normal( [ n ] ), name = 'bias1' )
  • layer1 = tf.sigmoid( tf.matmul( X, W1 ) + b1 )

학습횟수 늘이는 것과 layer 갯수 늘이는 것의 차이?

logistic 갯수 늘이는 것과 layer 갯수 늘이는 것의 차이?

depth가 늘어가는 것 = layer가 늘어나는 것, 뒤로 값이 넘어갈수록 정확하기는 하지만, 너무 많아지만 오히려 안좋은 현상 발생할 수 있고, 둘 다 무조건 많다고 좋은 것은 아니다.

 

W1 = tf.Variable(tf.random_normal([2,2]), name='weight1')
b1 = tf.Variable(tf.random_normal([2]), name='bias1')
layer1 = tf.sigmoid(tf.matmul(X,W1)+b1)

# 다시 logistic을 수행하기 위해서는 y값이 2개가 나와야 다음 x로 들어가서 수행 가능
# 따라서 [2,2] , [2]크기로 냄

W2 = tf.Variable(tf.random_normal([2,1]), name='weight2')
b2 = tf.Variable(tf.random_normal([1]), name='bias2')
# 마지막 값은 logistic을 위해서 하나의 값으로 나온다.

Hypothesis

logit = tf.matmul(layer1,W2) + b2
H = tf.sigmoid(logit)

Cost function

cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logit, labels=Y))

Train

optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1 )
train = optimizer.minimize(cost)

Session, 초기화

sess = tf.Session()
sess.run(tf.global_variables_initializer())

학습

for step in range(30000):
    _, cost_val = sess.run([train, cost], feed_dict={X: x_data,
                                                     Y: y_data})
    if step % 3000 == 0:
        print(f'cost값은:{cost_val}')
        
# cost값은:0.8544375896453857
# cost값은:0.482330858707428
# cost값은:0.040052928030490875
# cost값은:0.018248548731207848
# cost값은:0.011669149622321129
# cost값은:0.008541891351342201
# cost값은:0.00672385236248374
# cost값은:0.005538139026612043
# cost값은:0.004704924300312996
# cost값은:0.004087945446372032

예측

predict = tf.cast(H>0.5, tf.float32)
sess.run(predict, feed_dict={X:[[0,0]]})

# 출력
# array([[0.]], dtype=float32)
반응형
Comments