실습_5. 퍼셉트론

Updated:

퍼셉트론 작동 예시 직접 실행해보기

이번 실습에서는 강의 영상을 통해 학습한 퍼셉트론의 작동 예시를 직접 파이썬 코드로 구현해보도록 하겠습니다.

값을 다양하게 입력해보고,신호의 총합값을 계산해 Activation 함수에 따라 외출 여부(1,0)을 반환하는 Perceptron 함수를 작성해보며 퍼셉트론의 작동 예시를 이해해보도록 하겠습니다.

  1. 입력 받은 값들을 이용하여 계산한 신호의 총합 output과 그에 따른 외출 여부(1: 외출한다, 0: 외출 안한다) y를 반환하는 Perceptron 함수를 완성하세요.
    • Activation 함수는 신호의 총합이 0보다 크면 외출한다 입니다.
    • bias(편향) 값은 외출을 좋아하는 정도를 의미하며, -1로 설정되어 있습니다.
  2. 실행 버튼을 눌러 x1x1, x2x2, w1w1, w2w2 값을 다양하게 입력해보고, Perceptron함수에서 반환한 신호의 총합과 그에 따른 외출 여부를 확인하고 제출하세요.
from elice_utils import EliceUtils

elice_utils = EliceUtils()

# 1. 신호의 총합과 외출 여부를 반환하는 Perceptron 함수를 완성하세요.
def Perceptron(x_1,x_2,w_1,w_2):
    
    # bias는 외출을 좋아하는 정도로 -1로 설정되어 있습니다.
    bias = -1
    
    # 입력 받은 값과 편향(bias)값을 이용하여 신호의 총합을 구하세요.
    output = x_1 * w_1 + x_2 * w_2 + bias
    
    # 지시한 Activation 함수를 참고하여 외출 여부(0 or 1)를 설정하세요.
    # 외출 안한다 : 0 / 외출 한다 : 1 
    y = 1 if output >= 0 else 0
    
    return output, y
    
# 값을 입력 받는 함수입니다. 
def input_func():
    
    # 비 오는 여부(비가 온다 : 1 / 비가 오지 않는다 : 0)
    x_1 =  int(input("x_1 : 비가 오는 여부(1 or 0)을 입력하세요."))
        
    # 여자친구가 만나자고 하는 여부(만나자고 한다 : 1 / 만나자고 하지 않는다 : 0)
    x_2 =  int(input("x_2 : 여친이 만나자고 하는 여부(1 or 0)을 입력하세요."))
        
    # 비를 좋아하는 정도의 값(비를 싫어한다 -5 ~ 5 비를 좋아한다)
    w_1 =  int(input("w_1 : 비를 좋아하는 정도 값을 입력하세요."))
        
    # 여자친구를 좋아하는 정도의 값(여자친구를 싫어한다 -5 ~ 5 비를 좋아한다)
    w_2 =  int(input("w_2 : 여친을 좋아하는 정도 값을 입력하세요."))
        
    return x_1,x_2,w_1,w_2
    
def main():
    
    x_1,x_2,w_1,w_2 = input_func()
    
    y, go_out = Perceptron(x_1,x_2,w_1,w_2)
    
    print("\n신호의 총합 : %d" %y)
    print("외출 여부 : %d\n" %go_out)
    
if __name__ == "__main__":
    main()

AND gate와 OR gate 구현하기

이번 실습에서는 이론 영상을 통해 학습한 퍼셉트론의 AND gate와 OR gate를 직접 구현해보도록 하겠습니다.

AND gate와 OR gate는 한 개의 퍼셉트론으로 구현했기 때문에 단층 퍼셉트론이라고 부릅니다.

단층 퍼셉트론 AND gate와 OR gate 를 직접 구현해보며 적절한 가중치(weight) 와 편향(bias) 값을 찾아보고, 가장 기본적인 Activation function인 step function을 구현해보도록 하겠습니다.

  • And_gate 함수를 구현하세요.
  1. And gate의 Input인 x1과 x2에 곱해줄 가중치(weight)가 각각 0.5, 0.5 로 주어졌을 때, 입력값과 가중치를 곱한 값에 편향을 더한 값 즉, 가중 신호의 총합(output) 이 위의 입출력 표를 만족할 수 있도록 편향(bias)값을 설정해 bias에 저장하세요.

여러 가지 값을 대입해보며 적절한 편향(bias) 값을 찾아보세요.

  1. 가중치, 입력값, 설정한 편향 값을 이용해 가중 신호의 총합을 구해 y에 저장하세요.

numpy 행렬의 합을 구하는 메소드

np.sum()
  • OR_gate 함수를 구현하세요.
  1. OR gate의 Input인 x1과 x2에 곱해줄 가중치(weight)가 각각 0.5, 0.5 로 주어졌을 때, 입력값과 가중치를 곱한 값에 편향을 더한 값 즉, 가중 신호의 총합(output) 이 위의 입출력 표를 만족할 수 있도록 편향(bias)값을 설정해 bias에 저장하세요.

여러 가지 값을 대입해보며 적절한 편향(bias) 값을 찾아보세요.

  1. 가중치, 입력값, 설정한 편향 값을 이용해 가중 신호의 총합을 구해 y에 저장하세요.

numpy 행렬의 합을 구하는 메소드

np.sum()
from elice_utils import EliceUtils
elice_utils = EliceUtils()

import numpy as np

# 1. AND gate 함수를 구현하세요.
def AND_gate(x1, x2):
    x = np.array([x1, x2])
    print(x)
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([0.5,0.5])
    
    # 1-1. AND gate를 만족하는 bias를 설정합니다.
    bias = -2
    
    # 1-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x + weight) + bias
    print(y)
    # Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)

# 2. OR gate 함수를 구현하세요.
def OR_gate(x1, x2):
    x = np.array([x1, x2])
    
    # x1과 x2에 각각 곱해줄 가중치 0.5, 0.5로 설정
    weight = np.array([0.5,0.5])
    
    # 2-1. OR gate를 만족하는 bias를 설정합니다.
    bias = -1.5
    
    # 2-2. 가중치, 입력값, 편향을 이용하여 가중 신호의 총합을 구합니다.
    y = np.sum(x + weight) + bias
    print(y)
    #Step Function 함수를 호출하여 AND gate의 출력값을 반환합니다.
    return Step_Function(y)

# 3. Step Function 구현
def Step_Function(y):
    if y > 0:
        return 1
    else:
        return 0   
    
def main():
    
    # AND Gate와 OR Gate에 넣어줄 Input 입니다.
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # AND Gate를 만족하는지 출력하여 확인합니다.
    print('AND Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',AND_gate(x1, x2))
        
    # OR Gate를 만족하는지 출력하여 확인합니다.
    print('\nOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ',OR_gate(x1, x2))

if __name__ == "__main__":
    main()

NAND gate와 NOR gate 구현하기

앞선 실습에서는 가중치, 편향, Step Function을 이용하여 단층 퍼셉트론인 AND gate와 OR gate를 구현해보았습니다.

이번 실습에서는 가중치와 편향 값을 조정해보며 동일한 단층 퍼셉트론 NAND gate와 NOR gate를 구현해보도록 하겠습니다.

앞선 실습과 위의 입출력 표를 참고하여 NAND_gate 함수를 구현해보세요. 이번 실습에서는 편향 값 뿐만 아니라 가중치도 자유롭게 적절한 값을 설정해야합니다.

앞선 실습과 위의 입출력 표를 참고하여 NOR_gate 함수를 구현해보세요. 마찬가지로 편향 값 뿐만 아니라 가중치도 자유롭게 적절한 값을 설정해야합니다.

앞선 실습을 참고하여 Step_Function 함수를 구현해보세요. 앞 실습에서 구현한 함수를 그대로 사용할 수 있습니다.

실행 버튼을 눌러 입출력 표와 결과 값을 비교해본 후 제출하세요.

import numpy as np
from elice_utils import EliceUtils

elice_utils = EliceUtils()

# 1. NAND_gate 함수를 구현하세요.
def NAND_gate(x1, x2):
    x = np.array([x1,x2])
    weight = np.array([-0.5,-0.5])
    bias = 0.7
    y = np.sum(x*weight) + bias
    
    return Step_Function(y)
    
# 2. NOR gate 함수를 구현하세요.
def NOR_gate(x1, x2):
    x = np.array([x1,x2])
    weight = np.array([-0.5,-0.5])
    bias = 0.1
    y = np.sum(x*weight) + bias
    
    return Step_Function(y) 
    
# 3. Step Function 함수를 구현하세요.
# 앞 실습에서 구현한 함수를 그대로 사용할 수 있습니다.
def Step_Function(y):
    if y > 0:
        return 1
    else:
        return 0
def main():
    
    # NAND, NOR Gate에 넣어줄 Input
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # NAND, NOR Gate를 만족하는지 출력하여 확인
    print('NAND Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NAND_gate(x1, x2))
        
    print('NOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NOR_gate(x1, x2))
        

        
if __name__ == "__main__":
    main()

다층 퍼셉트론으로 XOR gate 구현하기

앞선 실습에서 단 하나의 퍼셉트론으로 매개변수인 가중치와 편향을 조정하여 AND, OR, NAND, NOR Gate를 구현하였습니다.

이들은 하나의 직선으로 영역을 나눔으로써 출력을 조정하여 나온 결과라고 할 수 있습니다.

그러면 XOR Gate를 구현하기 위해서는 어떻게 가중치와 편향을 조정하여야 할까요?

위의 그림과 같이 한 개의 퍼셉트론으로는 하나의 직선으로 영역을 나누기 때문에 XOR Gate 구현이 불가능합니다.

하지만, 한 개의 퍼셉트론이 아닌 여러 층으로 퍼셉트론을 쌓는다면 어떨까요? 이번 실습에서는 앞서 구현한 다양한 퍼셉트론들을 활용하여 XOR Gate를 구현해보겠습니다.

AND_gate 함수를 구현하세요. 이전 실습에서 구현한 함수를 그대로 사용할 수 있습니다.

OR_gate 함수를 구현하세요. 이전 실습에서 구현한 함수를 그대로 사용할 수 있습니다.

NAND_gate 함수를 구현하세요. 이전 실습에서 구현한 함수를 그대로 사용할 수 있습니다.

Step_Function 함수를 구현하세요. 이전 실습에서 구현한 함수를 그대로 사용할 수 있습니다.

아래 그림을 참고하여 구현한 AND, OR, NAND gate 함수들을 활용해 XOR_gate 함수를 구현하세요.

xor

실행 버튼을 눌러 입출력 표와 결과 값을 비교해본 후 제출하세요.

import numpy as np
from elice_utils import EliceUtils

elice_utils = EliceUtils()

# 1. `AND_gate` 함수를 구현하세요. 
def AND_gate(x1,x2):
    x = np.array([x1,x2])
    weight = np.array([0.5,0.5])
    bias = -0.7
    
    return Step_Function(np.sum(x*weight)+bias)
    
# 2. `OR_gate` 함수를 구현하세요.
def OR_gate(x1,x2):
    
    x = np.array([x1,x2])
    weight = np.array([0.5,0.5])
    bias = -0.1
    
    return Step_Function(np.sum(x*weight)+bias)
    
# 3. `NAND_gate` 함수를 구현하세요.
def NAND_gate(x1,x2):

    x = np.array([x1,x2])
    weight = np.array([-0.5,-0.5])
    bias = 0.7
    
    return Step_Function(np.sum(x*weight)+bias)
    
    
# 4. Step_Function 함수를 구현하세요.
def Step_Function(y):
    return 1 if y>0 else 0
    
# 5. 구현한 AND, OR, NAND gate 함수들을 활용하여 XOR_gate 함수를 구현하세요. 
def XOR_gate(x1, x2):
    A = NAND_gate(x1, x2)
    B = OR_gate(x2,x1)
    Q = AND_gate(A,B)
    
    y = Q
    
    return y
    

def main():
    # NOR gate에 넣어줄 Input
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # XOR gate를 만족하는지 출력하여 확인
    print('XOR Gate 출력')
    for x1, x2 in array:
        print('Input: ',x1, x2, ', Output: ', XOR_gate(x1, x2))


if __name__ == "__main__":
    main()

Leave a comment