외로운 Nova의 작업실

지도 학습 - 다층 퍼셉트론 실습 본문

AI/machine-learning

지도 학습 - 다층 퍼셉트론 실습

Nova_ 2023. 11. 17. 13:29

- 다층 퍼셉트론으로 XOR 구현

import tensorflow as tf

 

XOR의 입력레이어를 설정하겠습니다. 입력레이어는 4행 2열이고 출력레이어는 4행 1열의 형태를 갖습니다.

X = tf.placeholder(tf.float32, shape=[4,2])
Y = tf.placeholder(tf.float32, shape=[4,1])

 

첫번째 히든 레이어입니다.

# 두개의 입력값을 받는 두개의 뉴론을 만듭니다.  
W1 = tf.Variable(tf.random_uniform([2,2]))
# 각각의 뉴론은 한개의 편향값을 갖습니다.
B1 = tf.Variable(tf.zeros([2]))
# 출력값으로 Z를 리턴하도록 합니다. sigmoid(W1 * X + B1)
Z = tf.sigmoid(tf.matmul(X, W1) + B1)

 

w1 두개의 가중치와 b1의 편향값의 결과값을 z로 리턴하게됩니다. 식으로 본다면 z = w1x1+w2x2+b 와 같습니다.

# Z를 입력값으로 받는 하나의 뉴론을 두번째 히든레이어에 만듭니다.
W2 = tf.Variable(tf.random_uniform([2,1]))
# 뉴론은 한개의 편향값을 갖습니다.
B2 = tf.Variable(tf.zeros([1]))
# 출력값으로 Y_hat을 리턴합니다. sigmoid(W2 * Z + B2)
Y_hat = tf.sigmoid(tf.matmul(Z, W2) + B2)

 

z값을 입력으로 하고 가중치값을 w2, 편향값을 b2로 하여 y_hat 결과값을 리턴합니다.

 

이제 손실함수를 크로스 엔트로피 함수로 사용하겠습니다.

# cross entropy
loss = tf.reduce_mean(-1*((Y*tf.log(Y_hat))+((1-Y)*tf.log(1.0-Y_hat))))

 

경사하강법으로 매개변수를 최적화하겠습니다.

# 경사하강법
train_step = tf.train.GradientDescentOptimizer(0.05).minimize(loss)

 

이제 학습시켜보겠습니다.

# 학습데이터를 만듭니다.
train_X = [[0,0],[0,1],[1,0],[1,1]]
train_Y = [[0],[1],[1],[0]]

# 텐서플로우 매개변수 초기화 선언
init = tf.global_variables_initializer()

# 학습을 시작합니다.
with tf.Session() as sess:
    # 매개변수 초기화
    sess.run(init)
    
    # 학습 데이터 출력
    print("train data: " + str(train_X))
    
    # 2만 번의 반복학습을 진행
    for i in range(20000):
        # 학습 단계 실행, 입력 데이터와 레이블을 피드(dict)로 전달
        sess.run(train_step, feed_dict={X: train_X, Y: train_Y})
        
        # 5000번마다 현재 에포크와 출력값 출력
        if i % 5000 == 0:
            print('Epoch : ', i)
            print('Output : ', sess.run(Y_hat, feed_dict={X: train_X, Y: train_Y}))

    # 최종 출력값 출력
    print('Final Output : ', sess.run(Y_hat, feed_dict={X: train_X, Y: train_Y}))

학습 결과  0,0 과 1,1 은 0에 가까운 값을 출력하고, 1,0과 0,1은 1에 가까운 값을 출력하는 것을 볼 수 있습니다.

 

Comments