외로운 Nova의 작업실
지도 학습 - 다층 퍼셉트론 실습 본문
- 다층 퍼셉트론으로 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에 가까운 값을 출력하는 것을 볼 수 있습니다.
'AI > machine-learning' 카테고리의 다른 글
머신 러닝 - 다층 퍼셉트론 손글씨 분류 실습 (0) | 2023.11.17 |
---|---|
지도 학습 - 퍼셉트론 실습 (1) | 2023.11.17 |
지도 학습 - 딥러닝 (0) | 2023.11.16 |
비지도 학습 - 주성분 분석 (0) | 2023.11.10 |
비지도 학습 - 로지스틱 회귀 (0) | 2023.11.07 |
Comments