Educode--Python 다층 퍼셉트론 실현

레벨 1: 완전히 연결된 계층의 순방향 전파 실현

미션 세부 정보

이 수준의 작업은 완전히 연결된 계층의 순방향 전파를 실현하는 것입니다.

관련 정보

이 작업을 완료하려면 다음을 마스터해야 합니다.

  1. 신경망의 구조;
  2. 완전히 연결된 계층의 정의.

본 교육의 내용은 책 "딥러닝 입문 - 파이썬 기반의 이론과 구현"의 3.1-3.5장을 참고하시기 바랍니다.

신경망의 구조

이전 교육에서는 퍼셉트론과 다층 퍼셉트론에 대해 배웠고, 표현력이 더 강한 모델을 얻기 위해 퍼셉트론을 쌓아서 다층 퍼셉트론을 만드는 방법도 배웠습니다. 이 실습에서는 한 단계 더 나아가 신경망의 구조에 대해 배웁니다. 신경망은 여러 개의 신경망 층을 쌓아서 형성되며, 서로 다른 층은 데이터의 특징을 효과적으로 추출하고 입력 데이터를 저차 기능에서 고차 기능으로 점진적으로 추출하며 분류 및 회귀. 다층 퍼셉트론은 이미 매우 단순한 신경망입니다. 일반적인 신경망에는 다층 퍼셉트론, 컨볼루션 신경망 및 순환 신경망이 포함됩니다. 아래 그림은 간단한 신경망 모델을 보여줍니다.


그림 1 단순 신경망

신경망 구현에는 순전파와 역전파의 두 부분이 포함됩니다. 순방향 전파는 네트워크 모델의 예측 결과와 손실 함수를 계산하기 위해 훈련과 예측 모두에 사용됩니다. 역전파는 학습 과정에서 매개변수의 기울기를 계산하는 데 사용되며 네트워크 모델은 기울기 하강법을 사용하여 학습됩니다. 다음 몇 가지 연습에서는 신경망 모델의 순방향 전파에 초점을 맞추고 이후 훈련 소개에서 역전파에 대해 설명합니다.

이 교육을 시작으로 이를 사용하여 numpy일반적인 신경망 계층의 전방 및 후방 전파와 신경망 교육의 기본 방법을 포함하는 간단한 딥 러닝 프레임워크를 구현합니다.

완전히 연결된 계층의 정의

퍼셉트론을 사용하여 논리 게이트를 구현한 이전 예제를 다시 살펴보면 각 출력은 모든 입력 신호의 선형 조합입니다. 각각의 입출력 신호를 하나의 뉴런으로 간주하여 출력 뉴런과 입력 뉴런이 서로 연결되는데, 이러한 네트워크 계층을 완전 연결 계층(Fully Connected Layer)이라고 합니다.

공식적으로 N개의 입력 뉴런과 M개의 출력 뉴런이 있는 완전 연결 레이어에는 가중치 W∈RN×M과 바이어스 b∈RM의 두 세트 매개변수가 포함되며 입력은 N차원(열) 벡터 x∈RN으로 간주될 수 있습니다. , 이때 완전 연결 계층의 계산은 다음과 같이 표현할 수 있습니다.

y=xTW+b

완전히 연결된 계층을 통해 입력 기능을 선형 변환하여 새로운 기능 집합을 얻을 수 있습니다.

완전히 연결된 계층의 구현

교육은 클래스를 미리 정의했으며 FullyConnected이 클래스의 생성자에서 해당 가중치 W및 편향을 허용합니다 b. 가중치 W는 N×M numpy.ndarray이고 오프셋 b은 M의 길이입니다 numpy.ndarray. 여기서 N은 완전 연결 계층의 입력 채널 수이고 M은 완전 연결 계층의 출력 채널 수입니다.

이 연습에서는 정방향 전달 기능을 구현해야 합니다 forward(). forward()함수의 입력은 x2보다 크거나 같은 차원이고 numpy.ndarray모양은 (B, dim1 , dim2 ,..., dimk )이며, 여기서 B는 배치 크기, 즉 데이터의 개수입니다. . x먼저 의 모양을 변경하여 (B,N) 모양의 2D로 변환 해야 합니다 numpy.ndarray. 동시에 레코드의 원래 형태도 요구 x되며 original_x_shape. 마지막으로 선형 변환의 결과를 반환합니다.

프로그래밍 요구 사항

프롬프트에 따라 오른쪽 편집기에서 Begin과 End 사이에 코드를 추가하여 위의 완전 연결 계층의 정방향 전파를 실현합니다.

테스트 지침

플랫폼은 사용자가 작성한 코드를 테스트합니다. 테스트 방법은 다음과 같습니다. 플랫폼은 임의로 입력 x, 가중치 W및 편향을 생성한 b다음 구현 코드에 따라 클래스의 인스턴스를 생성한 FullyConnected다음 인스턴스를 사용하여 순방향 전파 계산을 수행합니다. . 귀하의 답변은 표준 답변과 비교됩니다. 답변과 표준 답변 사이의 오류가 1e-5를 초과하지 않는 한 부동 소수점 숫자 계산에 오류가 있을 수 있기 때문입니다.

샘플 입력:

 
 
  1. W:
  2. [[0.1, 0.2, 0.3],
  3. [0.4, 0.5, 0.6]]
  4. b:
  5. [0.1, 0.2, 0.3]
  6. x:
  7. [[1, 2],
  8. [3, 4]]

그러면 해당 출력 뉴런은 다음과 같습니다.

 
 
  1. [[1.0, 1.4, 1.8],
  2. [2.0, 2.8, 3.6]]

임무를 시작합시다. 성공을 기원합니다!

구현 코드:

numpy를 np로 가져오기


 

완전히 연결된 클래스:

    데프 __init__(self, W, b):

        아르 자형'''

        완전히 연결된 계층의 초기화.

        매개변수:

        - W: numpy.array, (D_in, D_out)

        - b: numpy.array, (D_out)

        '''

        자체.W = W

        자기.b = b

        self.x = 없음

        self.original_x_shape = 없음

    데프 포워드(self, x):

        아르 자형'''

        완전히 연결된 계층의 순방향 패스입니다.

        매개변수:

        - x: numpy.array, (B, d1, d2, ..., dk)

        반품:

        - y: numpy.array, (B, M)

        '''

        ########## 시작하다 ##########

        self.original_x_shape=x.shape

        x=x.reshape(x.shape[0],-1)

        자기.x=x

        out=np.dot(self.x,self.W)+self.b

        돌아가다

        ########## 끝 ##########

 코드 스크린샷:

레벨 2: 일반적인 활성화 기능의 순방향 전파 구현

미션 세부 정보

이 수준의 작업: 공통 활성화 기능의 순방향 전파를 실현합니다.

관련 정보

이 작업을 완료하려면 일반적인 활성화 기능의 정의를 마스터해야 합니다.

본 교육의 내용은 책 "딥러닝 입문 - 파이썬 기반의 이론과 구현"의 3.1-3.5장을 참고하시기 바랍니다.

활성화 기능의 역할

먼저 두 개의 완전히 연결된 계층으로 구성된 신경망을 고려해 보겠습니다. 이 두 개의 완전 연결 레이어의 가중치와 오프셋이 각각 W1 , b1 및 W2 , b2 이고 입력이 x라고 가정하면 이전 패스의 완전 연결 레이어의 계산 공식에서 다음을 얻을 수 있습니다. 몇 가지 결론:

y =(x×W1 +b1 )×W2 +b2 =x×W1 ×W2 +b1 ×W2 +b2

행렬 곱셈이 결합 법칙을 만족하기 때문에 W0 =W1 ×W2 , b0 =b1 ×W2 +b2 라고 하면 위의 두 완전 연결 계층은 다음과 같이 쓸 수 있습니다.

y=x×W0 +b0

즉, 완전히 연결된 두 개의 레이어를 쌓는 것은 완전히 연결된 레이어 하나와 동일하므로 이 쌓기는 유효하지 않으며 모델의 피팅 능력을 향상시킬 수 없습니다. 이 문제를 해결하기 위해 일반적으로 각 레이어 뒤에는 비선형 활성화 함수가 있습니다. 비선형 활성화 기능을 도입함으로써 모델의 피팅 능력을 크게 향상시킬 수 있습니다.

논리 게이트를 구현하기 위해 퍼셉트론을 사용했을 때를 돌이켜보면 선형 변환 후에 기호 함수를 사용했는데 실제로는 활성화 함수입니다. 퍼셉트론을 다층 퍼셉트론으로 쌓아서 XOR 게이트를 구현할 수 있는 것은 기호 함수를 사용하기 때문입니다.

일반적인 활성화 기능의 정의

1. 시그모이드 활성화 함수

시그모이드 활성화 함수는 어떤 범위의 입력이라도 [0,1]의 범위로 변환할 수 있는 S자형 함수이며, 이 범위는 확률의 범위와 동일하므로 이것으로 "확률"을 구현할 수 있습니다. 반면 시그모이드 활성화 함수의 기울기는 x의 절대값이 크면 0에 매우 가까워 "기울기 소실" 문제가 발생하여 네트워크가 수렴하기 어렵습니다. 함수 표현은 다음과 같습니다.

시그모이드(x)=1/(1+e−x)

현재 시그모이드 활성화 함수의 응용 시나리오는 주로 두 가지 유형을 포함합니다: 첫 번째는 확률을 계산하는 데 사용되며 시그모이드 함수의 특성과 일치합니다. 컴퓨터 비전 및 자연어 처리 분야 일반적으로 사용되는 기술로 관심 있는 학생들이 스스로 학습할 수 있도록 남겨둡니다.

2. ReLU 활성화 기능

ReLU 활성화 함수는 현재 딥러닝에서 가장 많이 사용되는 활성화 함수로 입력 텐서 중 0보다 큰 부분만 유지하고 0보다 작은 부분은 0으로 설정한다. 이전 시그모이드와 달리 ReLU 활성화 함수는 기울기가 사라지는 문제가 없습니다. 함수 표현은 다음과 같습니다.

ReLU(x)=최대(0,x)

ReLU는 현재 컨볼루션 신경망에서 가장 널리 사용되는 활성화 함수로 계산이 간단한 것이 특징이며 기울기 소멸 문제의 영향을 받지 않습니다. 그러나 ReLU에도 일정한 문제가 있는데, 예를 들어 ReLU의 출력이 음수가 아니므로 ReLU 출력의 평균값은 0이 아닌 양수여야 합니다. 이는 네트워크 훈련에 어느 정도 영향을 미칠 수 있습니다. 이 문제에 대응하여 연구원들은 LReLU 및 PReLU와 같은 개선 방법을 제안했으며 관심있는 학생들은 학습에 대한 관련 정보를 찾을 수 있습니다.

일반적인 활성화 기능의 구현

이 실습에서는 시그모이드 및 ReLU 활성화 기능의 정방향 전파를 구현해야 합니다. Sigmoid교육에는 클래스와 클래스가 미리 정의되어 있습니다 ReLU. 이 연습에서는 정방향 전달 기능을 구현해야 합니다 forward(). forward()함수의 입력은 x2보다 크거나 같은 차원 numpy.ndarray이고 모양은 (B,d1 ,d2 ,...,dk )입니다. 여기서 B는 배치 크기입니다. 활성화 함수에 의해 처리된 출력 값을 반환합니다.

프로그래밍 요구 사항

프롬프트에 따라 오른쪽 편집기에서 Begin과 End 사이에 코드를 추가하여 위의 활성화 기능을 실현합니다.

향후 역전파의 편의를 위해 다음을 수행하시기 바랍니다.

  1. 시그모이드를 구현할 때 출력 결과를 self.out;
  2. ReLU를 구현할 때 0보다 작은 요소는 mask 형태로 기록됩니다 self.mask.

테스트 지침

플랫폼은 당신이 작성한 코드를 테스트할 것입니다.테스트 방법은 플랫폼이 임의로 입력 x및 출력 그라디언트를 생성한 다음 dout구현 코드에 따라 Sigmoid/ 클래스의 인스턴스를 만든 ReLU다음 이 인스턴스를 사용하여 순방향 전파 계산을 수행하는 것입니다. 귀하의 답변은 표준 답변과 비교됩니다. 답변과 표준 답변 사이의 오류가 1e-5를 초과하지 않는 한 부동 소수점 숫자 계산에 오류가 있을 수 있기 때문입니다.

샘플 입력:

 
 
  1. # 对于sigmoid激活函数:
  2. x:
  3. [[-1, 0, 1]]
  4. #对于ReLU激活函数:
  5. x:
  6. [[-1, 0, 1]]

그러면 해당 출력은 다음과 같습니다.

 
 
  1. # 对于sigmoid激活函数:
  2. [[0.27, 0.50, 0.73]]
  3. #对于ReLU激活函数:
  4. [[0, 0, 1]]

위의 결과에는 무시할 수 있는 반올림 오류가 있습니다.


임무를 시작합시다. 성공을 기원합니다!

구현 코드:

numpy를 np로 가져오기


 

클래스 시그모이드:

    def __init__(self):

        self.out = 없음

    데프 포워드(self, x):

        아르 자형'''

        시그모이드 활성화 함수의 순방향 전파.

        매개변수:

        - x: numpy.array, (B, d1, d2, ..., dk)

        반품:

        - y: numpy.array, (B, d1, d2, ..., dk)

        '''

        ########## 시작하다 ##########

        출력 = 1. / (1. + np.exp(-x))

        self.out = 아웃

        돌아가다

        ########## 끝 ##########


 

클래스 ReLU:

    def __init__(self):

        self.mask = 없음

    데프 포워드(self, x):

        아르 자형'''

        ReLU 활성화 함수의 순방향 전파.

        매개변수:

        - x: numpy.array, (B, d1, d2, ..., dk)

        반품:

        - y: numpy.array, (B, d1, d2, ..., dk)

        '''

        ########## 시작하다 ##########

        자기.마스크 = (x <= 0)

        출력 = x.copy()

        아웃[셀프.마스크] = 0

        돌아가다

        ########## 끝 ##########

코드 스크린샷:

 

 

 

추천

출처blog.csdn.net/qq_57409899/article/details/124205567