파이썬 이것저것/파이썬 딥러닝 관련

[Python] 딥러닝 퍼셉트론 선형분류기

agingcurve 2022. 7. 13. 23:54
반응형

https://kdc-elice.imweb.me/

 

엘리스 내일 패스, 가볍게 코딩 시작

엘리스 내일패스를 통해 파이썬, SQL을 활용한 데이터 분석부터 웹개발, R 등 핫한 개발 주제들을 쉽고 편하게 수강할 수 있습니다.

kdc-elice.imweb.me

엘리스 코딩 내일패스 인공지능 과정을 수강하고 작성

 

퍼셉트론 선형 분류기


퍼셉트론은 간단하면서도 Powerful한 성능을 낸다. 사람의 신경계를 모티브로 가져온 모델로, 퍼셉트론이라는 작은 유닛이 모여서 인공신경망을 만들고, 사람의 지능을 따라할고 하는 인공지능을 만든다.

논리 회로의 정리

 

일정한 논리 연산에 의해 출력을 얻는 회로를 의미

And Gate


A와 B 가 있으면 둘다 참이여야지 1이고 나머지는 0이다.

 

OR Gate


A와 B가 둘다 0이면 0이고 나머지는 1이다 두개다 선형분류기로 충분히 구분이 가능하다.

 

 

 

NAND(Not-AND) Gate


AND Gate와 정반대로 둘다 참이면 0이고 나머지는 1이다.

 

 

NOR(Not-OR) Gate


OR Gate와 정반대로 둘다 0이면 1이고 나머지는 0이다.

 

 

선형분류를 위한 퍼셉트론


Output layer의 여러개를 분류할 수 있고, 단층 퍼셉트론에 대해 구분을 할 수 있다.
Input Layer에서 Output Layer 각각의 X에 대해서 가중치가 붙고,Output으로 넘어가는게 Single Layer 퍼셉트론이다.

 

 

입력층

외부로부터 데이터를 입력 받는 신경망 입구의 Layer

출력층

모델의 최종 연산 결과를 내보내는 신경망 출구의 Layer

 

비 선형적인 문제


많은 데이터들이 선형으로 분류할 때, 하나의 선으로 제대로 구분 되지 않는 경우가 많음

 

XOR gate

 

 XOR gate는 A와 B가 둘중 하나만 1일때 1 이고 나머진 0이 된다. 선형분류기는 기존 1개만 선을 그을 수 있지만, 1개만 그어서는 XOR gate를 구분 할 수 없다.

비 선형 적인 접근 방법의 필요성


안쪽에 있는건 1이고 밖에 있는 것은 0으로 만들어주는 것이다.

 

5가지의 논리연산 게이트를 구현해보자

 

import numpy as np


def AND_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([0.5,0.5])
    
    bias = -0.7
    
    y = np.matmul(x, weight) + bias
    
    return Step_Function(y)
    

def OR_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([0.5,0.5])
    
    bias = -0.3
    
    y = np.matmul(x, weight) + bias
    
    return Step_Function(y)

def NAND_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([-0.5 , -0.5])
    
    bias = 0.7
    
    y = np.matmul(x, weight) + bias
    
    return Step_Function(y)

def NOR_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([-0.5, -0.5])
    
    bias = 0.3
    
    y = np.matmul(x, weight) + bias
    
    return Step_Function(y) 

def XOR_gate(x1, x2):
    
    x = np.array([x1, x2])
    
    weight = np.array([0.3, -0.5])
    
    bias = 0.7
    
    y = np.matmul(x, weight) + bias
    
    return Step_Function(y)

def Step_Function(y):
    
    return 1 if y >=0 else 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))

    # NAND와 NOR Gate에 넣어줄 Input
    array = np.array([[0,0], [0,1], [1,0], [1,1]])
    
    # NAND Gate를 만족하는지 출력하여 확인
    print('NAND Gate 출력')
    
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NAND_gate(x1, x2))
    
    # NOR Gate를 만족하는지 출력하여 확인
    print('\nNOR Gate 출력')
    
    for x1, x2 in array:
        print('Input: ',x1, x2, ' Output: ',NOR_gate(x1, x2))
        
         # XOR Gate에 넣어줄 Input과 그에 따른 Output
    Input = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])        
    Output = np.array([[0], [1], [1], [0]])
    
    # XOR Gate를 만족하는지 출력하여 확인
    print('XOR Gate 출력')
    
    XOR_list = []
    
    for x1, x2 in Input:
        print('Input: ',x1, x2, ' Output: ', XOR_gate(x1, x2))
        XOR_list.append(XOR_gate(x1, x2))
    
    hit = 0
    for i in range(len(Output)):
        if XOR_list[i] == Output[i]:
            hit += 1
    
    acc = float(hit/4)*100
    
    print('Accuracy: %.1lf%%' % (acc))

if __name__ == "__main__":
    main()