외로운 Nova의 작업실

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

AI/machine-learning

지도 학습 - 퍼셉트론 실습

Nova_ 2023. 11. 17. 13:12

- and, or 연산 퍼셉트론 실습

 

먼저 데이터를 준비합니다.

import tensorflow as tf

T = 1.0
F = 0.0
bias = 1.0	

def get_AND_data():
    X = [
    [F, F, bias],
    [F, T, bias],
    [T, F, bias],
    [T, T, bias]
    ]
    
    Y = [
        [F],
        [F],
        [F],
        [T]
    ]
    
    return X, Y

def get_OR_data():
    X = [
    [F, F, bias],
    [F, T, bias],
    [T, F, bias],
    [T, T, bias]
    ]
    
    Y = [
        [F],
        [T],
        [T],
        [T]
    ]
    
    return X, Y

def get_XOR_data():
    X = [
    [F, F, bias],
    [F, T, bias],
    [T, F, bias],
    [T, T, bias]
    ]
    
    Y = [
        [F],
        [T],
        [T],
        [F]
    ]
    
    return X, Y

 

실습할 연산을 선택합니다.

X, Y = get_AND_data()
#X, Y = get_OR_data()
#X, Y = get_XOR_data()

 

퍼셉트론을 구성합니다.

W = tf.Variable(tf.random_normal([3, 1]))

 

손실함수로 MSE를 사용합니다.

f = tf.matmul(X, W)
output = step(f)
error = tf.subtract(Y, output)
mse = tf.reduce_mean(tf.square(error))

 

퍼셉트론은 경사하강법을 사용한 최적화가 불가능하므로, 목표가 1인데 결과값이 0이면 가중치를 더주고, 목표가 0인데 결과값이 1이면 가중치를 빼는 룰을 적용시켜줍니다.

#if target == 1 and activation == 0:
#w_new = w_old + input

#if target == 0 and activation == 1:
#w_new = w_old - input

delta = tf.matmul(X, error, transpose_a=True)
train = tf.assign(W, tf.add(W, delta))

 

이제 학습 및 테스트를 진행합니다.

# 변수 초기화 (기본값 할당)
init = tf.global_variables_initializer()

# 학습 시작
with tf.Session() as sess:
    # 초기화 연산 실행
    sess.run(init)
    
    # 초기 오차값 설정
    err = 1
    
    # 에포크 및 최대 에포크 설정
    epoch, max_epochs = 0, 20
    
    # 오차가 0보다 크고 최대 에포크에 도달하지 않을 때까지 반복
    while err > 0.0 and epoch < max_epochs:
        # 에포크 증가
        epoch += 1
        
        # 현재 평균 제곱 오차(MSE) 계산
        err = sess.run(mse)
        
        # 가중치 갱신 연산 실행
        sess.run(train)
        
        # 에포크와 현재 MSE 출력
        print('에포크:', epoch, 'MSE:', err)
    
    # 학습 완료 후 테스트 결과 출력
    print("\n테스트 결과:")
    print(sess.run([output]))

결과값이 0, 0, 0, 1이 나온것을 확인할 수 있습니다.

Comments