유진의 코딩스토리

Python DL 실습 1 [퍼셉트론, 신경망] 본문

Azure 실습/Azure deep learnig

Python DL 실습 1 [퍼셉트론, 신경망]

놀고먹는 유진 2024. 10. 23. 10:13

 

 

Compute Instance 생성

 

 

 

 


Azure ML에 실습과제 업로드

 

왼쪽 메뉴 바에서 notebooks 선택

 

 

notebooks 실행 > 폴더 업로드 > 소스 파일 선택 후 업로드

 

 

퍼셉트론

 

 

 

인간의 뉴런은 감각을 통해 얻은 신호를 취합하여 특정 값 이상이면 다음 뉴런으로 신호를 전달한다.

퍼셉트론은 이러한 인간의 뉴런을 모방하여 수학적으로 모델링 한 것으로 입력값과 가중치의 선형 결합으로 되어있다.

 

위 퍼셉트론은 선형결합의 결과값과 임계값에 따라 출력값의 신호 전달 여부를 정하는 모델이다.(분류문제를 해결한다.)

 

 

 

 

 

 

 

 

 

AND Gate 

두 입력이 모두 1일 때만 1 출력, 나머지는 0 츨력

 

AND 게이트 구현

 

 

OR Gate

두 입력 중 하나라도 1일 때 1 출력, 나머지 0 출력

OR 게이트 구현

 

 

NAND gate

AND gate와 정 반대의 결과 출력

NAND 게이트 구현

 

 

XOR Gate

둘 중 하나만 1인 경우 1 출력, 나머지 0 출력

 

 

XOR에 대해 선형분류가 불가능함.

두개의 직선을 사용해야만 분류 가능

 

 

 

 

AND, NOT, OR gate 연산자들의 조합으로 XOR 퍼셉트론 문제를 해결 할 수 있음.

 

 

XOR 게이트 구현

 

신경망

활성화함수

입력값을 일정 기준에 따라 변화시켜 출력하는 비선형 함수

 

 

입력값과 가중치를 곱하여 bias를 더한 후 활성화 함수를 적용한다.

활성화 함수는 특정 임계값을 만족함면 해당 값을 출력하는 형식이다.

 

활성화 함수를 사용하는 이유

▶ 비선형성 추가 : 복잡한 데이터 패턴 학습 

▶ 출력 범위 제한 :  다음 층 입력값의 범위 제한

▶ Gradient 계산의 용이성 : 역전파로 가중치 조정시 활성화 함수의 도함수 필요

▶ 계산의 효율성 : 


활성화 함수에는 다양한 함수가 있다.

 

Step function

step function 구현

 

 

Sigmoid function

sigmoid function 구현

 

 

Relu function

relu function 구현

 

궁극적으로 relu함수를 많이 쓰는데 sigmoid 함수같은 경우 역전파 시 Gradient Vanishing 문제 가 발생한다.

 

Sigmoid 함수는 출력이 0과 1 사이의 범위를 가지며, 입력이 클수록 기울기가 매우 작아집니다. 이는 역전파 과정에서 기울기가 점점 작아져 가중치가 거의 업데이트되지 않는 기울기 소실 문제가 발생한다. 특히 신경망의 깊이가 깊어질수록 학습이 제대로 이루어지지 않을 수 있다.

 

 

 

 

다차원 배열의 계산 : 행렬

 

numpy 라이브러리를 활용하여 행렬을 계산해보자.

 

numpy로 matrix 구현

 

 

 

행렬의 곱셈

transposition : 대각을 기준으로 뒤집

 

 

 

 

 

다층 퍼셉트론 : MLP(Multi Layer Perceptron)

 

 

가장 기본 형태의 심층 신경망으로 여러개의 은닉층을 통해 복잡한 비선형 문제를 해결할 수 있는 인공 신경망의 기초 모델이다.

 

 

 

• 입력층(Input layer) : input 데이터

• 은닉층(Hidden layer) : 여러 퍼셉트론의 조합 (비선형 활성화 함수 사용), 입력 데이터를 가중치와 함께 처리하고 활성화 함수에 의해 출력을 결정하는 층으로 1개 이상의 은닉층을 가질 수 있음(층이 많아질수록 신경망의 깊이가 깊어진다.)

• 출력층(Output layer) : 모델의 최종 결과값, 분류문제에서는 각 class에 해당하는 노드들이 존재하며 회귀 문제에서는 하나의 노드에서 연속적인 값이 출력된다.

 

 

 

 

 

 

입력 2개, 출력 2개, 은닉층 2개인 3층 신경망

 

 

 

 

 

 

 

입력층에서 1층으로 신호 전달

관련 모듈 실행

 

 

 

  • os : 운영체제와 상호작용하기 위한 파이썬 기본 모듈, 파일과 디렉토리 경로 처리 등에 사용된다.
  • sys : 파이썬 인터프리터와 관련된 모듈

 

 

 

입력값 * 가중치 + bias 를 계산해서 가중치 출력값 계산

 

 

 

 

가중치 출력값에 활성화 함수 적용

 

 

 

 

 

 

 

 

1층에서 2층으로 신호 전달

1층 출력값 * 가중치 + bias 를 계산해서 가중치 출력값 계산

 

 

 

 

가중치 출력값에 활성화 함수 적용(sigmoid)

 

 

 

 

 

 

 

2층에서 3층으로 신호 전달

1층 출력값 * 가중치 + bias 를 계산해서 가중치 출력값 계산

 

 

 

마지막에는 softmax함수로 변환한다.

0번째 노드가 37%의 확률을 지니고 1번째 노드는 63%의 확률을 지니므로 두번째 원소가 정답일 확률이 가장 높다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

손글씨 숫자 인식

 

숫자 인식을 위한 MNIST 데이터 셋

 

  •  MNIST 데이터셋은 0부터 9까지의 손글씨 이미지로 구성 
  • 훈련 데이터가 6만장, 테스트 데이터가 1만장 
  • 각 데이터는 이미지와 라벨로 이루어짐
  • 각 이미지는 28×28 해상도의 흑백 사진 
  • 각 픽셀은 0에서 255로 밝기 표현

결과 이미지

 

Image matrix

 

이미지를 수치화하면 28 * 28 행렬로 0 ~ 255로 각 픽셀의 밝기를 표현하도록 구성된다.(밝을수록 255에 가까운 값을 가진다.)

하지만 이를 신경망에 입력으로 넣기 위해 평탄화(flatten)를 진행하여 총 784개의 노드에 입력으로 넣는다.

 

 

hidden layer를 추가해서 입력값에 가중치를 곱해 출력값을 계산하고 활성화 함수(sigmoid)적용한 후 다시 가중치를 곱해 계산한 후 활성화함수(softmax) 적용하여 결과를 출력한다.

 

출력결과 노드는 확률값으로 구현되어있는데 이는 해당 숫자 이미지가 어떤 숫자 값으로 인식되는지를 확률로 표현한 것으로 사진에서 보다시피 9 노드의 확률값이 가장 높아  숫자 인식에 성공한 것을 알 수 있다.