@senspond

>

빅데이터/AI 🍎>데이터 사이언스

파이썬으로 퍼셉트론(Perceptron) 구현하기

등록일시 : 2024-03-09 (토) 12:20
업데이트 : 2024-04-07 (일) 02:34
오늘 조회수 : 9
총 조회수 : 1128

    원시적인 퍼셉트론(Perceptron)은 입력데이터를 2개의 클래스 중 하나로 분류하는 모델로 고전적인 선형 분류 모델입니다. 인공 신경망의 레이어를 구성하는 가장 기초적인 토대가 된다고 할 수 있습니다.

    원시적인 퍼셉트론(Perceptron)은 입력데이터를 2개의 클래스 중 하나로 분류하는 모델로 고전적인 선형 분류 모델입니다.

    인공 신경망의 레이어를 구성하는 가장 기초적인 토대가 된다고 할 수 있습니다.


    ( https://cs231n.github.io/neural-networks-1/ )


    y = wx + b


    퍼셉트론으로 구성된 레이어를 여러층으로 쌓아 다중클래스를 분류하거나 비선형 문제 등 보다 복잡한 문제를 풀 수가 있습니다.





    파이썬으로 퍼셉트론 구현하기

    퍼셉트론으로 AND, OR, NAND, XOR 게이트 구현

    초 간단하게 디지털 논리회로를 퍼셉트론으로 구현하는 예제입니다.

    # x : 가중치
    # b : 편향
    def Perceptron(x, w, b):
        y = np.sum(w * x) + b
        if y <= 0:
            return 0
        else:
            return 1

    출력 값이 0과 1 을 리턴하는 퍼셉트론을 작성했습니다.

    그리고 아래처럼 작성합니다.

    # NAND 게이트
    def NAND(x1, x2):
        return Perceptron(np.array([x1, x2]), np.array([-0.5,-0.5], 0.7)
     
    # OR 게이트
    def OR(x1, x2):
        return Perceptron(np.array([x1, x2]), np.array([0.5,0.5], -0.2)
     
    # AND 게이트
    def AND(x1, x2):
        return Perceptron(np.array([x1, x2]), np.array([0.5,0.5], -0.7)

    그리고 AND, OR, NAND 에 입력을 해서 확인을 해볼 수 있습니다.


    그런데, 단층 퍼셉트론은 비선형 문제인 배타적 논리합(XOR) 을 풀수가 없는데요. 

    XOR 은 입력값 x1, x2 두값이 서로 같지 않을 때만 1을 출력하고 그외에는 0을 출력합니다.



    그림을 보시면 XOR은 신경망의 출력인 가설 공간을 직선 형태로 나눌 수가 없습니다.

    즉, y = ax + b 와 같은 선형 함수로는 해를 구하지 못한다는 의미입니다.



    디지털 논리회로에서 NAND, OR, AND를 조합해서 XOR 게이트를 완성하듯이 다층 퍼셉트론으로 이 문제를 해결할 수가 있습니다.

    # XOR 게이트
    def XOR(x1, x2):
        return AND(NAND(x1, x2), OR(x1, x2))


    퍼셉트론 제대로 구현하기

    좀더 제대로 퍼셉트론을 구현해봅니다. 위의 AND, OR, .. 게이트는 미리 알고 있는 가중치와 편향값을 넣어서 구현했습니다. 기본적으로 모델에는 학습을 할 수 있는 fit 과 예측을 할 수 있는 predict 라는 메소드가 정의되어야 합니다.


    단층 퍼셉트론은 층(Layer)가 하나뿐인 퍼셉트론입니다.

    입력 백터를 X, 가중치 백터를 w라 할때 두 백터의 내적연산은 아래와 같습니다.


    import numpy as np 
    X = np.array([12,32,23,44])
    w = np.array([1,2,2,4])
    # z
    np.dot(X, w) == 12 * 1 + 32 * 2 + 23 * 2 + 44 * 4 # ==> True


    출력값의 결정 함수의 표현은 아래처럼 할 수 있겠습니다.



    그림대로 구현을 하면 다음과 같습니다.

    import numpy as np
    
    class Perceptron:
    
      def __init__(self,eta=0.01,n_iter=50,random_state=1):
        self.eta = eta
        self.n_iter = n_iter # 학습횟수
        self.random_state = random_state
        self.w_ = 0
        self.b_ = 0
        self.loss_ = []
    
      # 가중치 초기화
      def init_weight(self, X):
        rgen = np.random.RandomState(self.random_state)
        self.w_  = rgen.normal(loc=0.0,scale=0.01,size=X.shape[1])  # 정규분포를 이용해서 가중치 초기화 
        self.b_ = np.float_(0.)      # 초기편향을 0으로
    
      # 학습
      def fit(self, X, y):
        self.init_weight(X)
        self.errors_ = []
    
        for i in range(self.n_iter):
          errors = 0
          for xi, target in zip(X,y):
            update = self.eta*(target - self.predict(xi))
            self.w_ +=  update*xi # 가중치 업데이트
            self.b_ += update     # 편향 업데이트
            errors += int(update != 0.0)
          # print(f"{i} epoch : {errors}")
          self.errors_.append(errors)
        return self
    
      def net_input(self,X):
        # 학습되어 나온 가중치와 편향으로 구해진 선형방정식
        return np.dot(X,self.w_) + self.b_ 
      
      # 분류 예측
      def predict(self,X):
        return np.where(self.net_input(X) >=0.0, 1, -1)


    양성클래스(1)과 음성클래스(-1)로 분류 할 수 있는 퍼셉트론입니다. 이진 분류기에 사용해 볼 수 있겠습니다.




    참고

    https://velog.io/@jhdai_ly/%EB%94%A5%EB%9F%AC%EB%8B%9DDL%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0Perceptron2-%EB%8B%A4%EC%B8%B5-%ED%8D%BC%EC%85%89%ED%8A%B8%EB%A1%A0-XOR-%EA%B2%8C%EC%9D%B4%ED%8A%B8-%EA%B5%AC%ED%98%84-NAND-%EC%8B%A0%EA%B2%BD%EB%A7%9D-%EB%8F%84%EC%9E%85



    senspond

    안녕하세요. Red, Green, Blue 가 만나 새로운 세상을 만들어 나가겠다는 이상을 가진 개발자의 개인공간입니다.

    댓글 ( 0 )

    카테고리내 관련 게시글

    현재글에서 작성자가 발행한 같은 카테고리내 이전, 다음 글들을 보여줍니다

    @senspond

    >

    빅데이터/AI 🍎>데이터 사이언스

    • 사이킷런 GridSearchCV 로 하이퍼 파라미터(Hyperparameter) 튜닝

      사이킷런의 GridSearchCV에 대해서 정리해 본 글입니다. 매개변수들에 대한 설명, 성능평가 방법, 샘플예제를 포함하고 있습니다.
        2024-02-17 (토) 03:44
      1. 윈도우 환경에서 머신러닝/딥러닝 개발을 위한 파이썬 개발환경 구성하기

        윈도우 환경에서 머신러닝/딥러닝 개발을 위한 파이썬 개발환경 구성하기입니다.
          2024-03-18 (월) 01:28
        1. [현재글] 파이썬으로 퍼셉트론(Perceptron) 구현하기

          원시적인 퍼셉트론(Perceptron)은 입력데이터를 2개의 클래스 중 하나로 분류하는 모델로 고전적인 선형 분류 모델입니다. 인공 신경망의 레이어를 구성하는 가장 기초적인 토대가 된다고 할 수 있습니다.
            2024-03-09 (토) 12:20
          1. PIL이미지 <-> numpy, tensor 상호변환, matplotlib 로 이미지시각화 방법 정리

            PIL이미지 <-> numpy, tensor 상호변환, matplotlib 로 이미지시각화 방법 정리를 해본 글입니다
              2024-03-20 (수) 12:59
            1. 시그모이드(Sigmoid) 활성화 함수에 대해 알아보고 파이썬으로 구현해보기

              시그모이드(Sigmoid) 활성함수에 대해 알아보고 파이썬으로 구현해보는 내용을 정리해봤습니다.
                2024-02-14 (수) 05:45