반응형

출처 : 밑바닥부터 시작하는 딥러닝 

퍼셉트론 관련해서 

좋은 소식: 복잡한 함수도 표현할 수 있다는 것 =>컴퓨터가 수행하는 복잡한 처리도 퍼셉트론으로 (이론상) 표현할 수 있음을 앞 장에서 설명했습니다.

나쁜 소식: 가중치를 설정하는 작업(원하는 결과를 출력하도록 가중치 값을 적절히 정하는 작업)은 여전히 사람이 수동으로 한다는 것입니다. => 신경망이 해결해준다. 

가중치 매개변수 값 

 

3.1 퍼셉트론에서 신경망으로

 

3.1.1 신경망의 예

가장 왼쪽 은 입력층 

맨 오른쪽 출력층 

중간 줄은 은닉층(입력층이나 출력층과 달리) 사람 눈에는 보이지 않습니다. 

0층, 1층, 2층 (층 번호를 0부터 시작하는 이유는 파이썬 배열의 인덱스도 0부터 시작하여 , 나중에 구현할 때 짝짓기 편하기 때문입니다.

 

신경망은 모두 3층으로 구성됩니다만, 가중치를 갖는 층은 2개뿐이기 때문에 '2층 신경망'이라고 합니다.

 

3.1.2 퍼셉트론 복습

퍼셉트론 복습

b 편향  : 매개변수 , 뉴런이 얼마나 쉽게 활성화되느냐를 제어합니다

w 가중치 : 매개변수, 각 신호의 영향력을 제어합니다 

네트워크에는 b가 보이지 않습니다. 여기에 편향을 명시한다면 아래와 같습니다 

가중치가 b이고 입력이 1인 뉴런이 추가되었습니다 

이 퍼셉트론의 동작은 x1, x2, 1이라는 3개의 신호가 뉴런에 입력되어 , 각 신호에 가중치를 곱한 후 , 다음 뉴런에 전달됩니다.

다음 뉴런에서는 이 신호들의 값을 더하여 , 그 합이 0을 넘으면 1을 출력하고 그렇지 않으면 0을 출력합니다.

y = h( b + w1x1 + w2x2)

 

 

3.1.3 활성화 함수의 등장

activation function : 조금전 h(x)라는 함수가 등장했는데 , 이처럼 입력 신호의 총합을 출력 신호로 변환하는 함수를 일반적으로 활성하 함수라 합니다. 

활성화 라는 이름이 말해주듯 활성화함수는 입력 신호의 총합이 활성화를 일으키는지를 정하는 역할을 합니다.

 

가중치가 곱해진 입력 신호의 총합을 계산하고 , 그 합을 활성화 함수에 입력해 결과를 내는 2단계로 처리됩니다. 

가중치가 달린 입력 신호와 편향의 총합을 계산하고 , 이를 a라 합니다. 

a를 함수 h()에 넣어 y를 출력하는 흐름입니다. 

뉴런 과 노드 

활성화 함수 h()

 

일반적으로 단순 퍼셉트론은 단층 네트워크에서 계단 함수(임계값을 경계로 출력이 바뀌는 함수)를 활성화 함수로 사용한 모델을 가리키고 

다층 퍼셉트론은 신경망(여러 층으로 구성되고 시그모이드 함수 등의 매끈한 활성화 함수를 사용하는 네트워크)을 가리킵니다.

 

3.2.2 활성화 함수

3.2.1 시그모이드 함수 sigmoid function

e는 자연 상수로 2.7182.. 의 값을 갖는 실수

h(x) = 1 /( 1+ exp^(-x)) exp^(-x) => e ^(-x)

함수는 입력을 주면 출력을 돌려주는 변환기죠 

신경망에서는 활성화 함수로 시그모이드 함수를 이용하여 신호를 변환하고 , 그 변환된 신호를 다음 뉴런에 전달합니다. 

퍼셉트론과 앞으로 볼 신경망의 주된 차이는 이 활성화 함수 뿐입니다.

 

3.2.2 계단 함수 구현하기

입력이 0을 넘으면 1을 출력하고 , 그 외에는 0을 출력하는 함수 입니다. 

def step_funtion(x):
    if x > 0:
        return 1
    else:
        return 0

x는 실수(부동소수점)만 받아들입니다. 

 

배열 지원 

def step_function(x):
    y = x>0
    return y.astype(np.int)

x라는 넘파이 배열을 준비하고  그 넘파이 배열에 부등호 연산을 수행합니다 

bool 배열 - 각각 원소에 부등호 연산 

 

astype() 메서드를 배열의 자료형을 변환할 때 

True는 1로 , False는 0으로 변환

 

 

3.2.3 계단 함수의 그래프 

matplotlib 라이브러리를 사용 

def step_function(x):
    return np.array( x >0 , dtype= np.int)

x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

-0.5 에서 5.0 전 까지 0.1 각격의 넘파이 배열을 생성합니다. 

0을 경계로 출력이 0에서 1(또는 1에서 0)로 바뀝니다.

 

3.2.4 시그모이드 함수 구현하기

def sigmoid(x):
    return 1 / (1+ np.exp(-x))

np.exp(-x) 는 exp(-x)수식에 해당합니다. 

x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)

이 함수가 넘파이 배열도 훌륭히 처리해줄 수 있는 비밀은 넘파이의 브로드캐스트에 있습니다.

브로드캐스트 기능이란 넘파일 배열과 스칼라값의 연산을 넘파이 배열릐 원소 각각과 스칼라값의 연산으로 바꿔 수행하는 것입니다.

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()

3.2.5 시그모이드 함수와 계단 함수 비교

입력이 작을 때의 출력은 0에 가깝고(혹은 0 이고 ). 입력이 커지면 출력이 1에 가까워지는(혹은 1이 되는)구조인 것이다.

계딴 함수와 시그코이드 함수는 입력이 중요하면 큰 값을 출력하고 입력이 중요하지 않으면 작은 값을 출력합니다.

그리고 입력이 아무리 작거나 커도 출력은 0에서 1사이라는 것도 둘의 공통점입니다.

 

차이점 1

시그모이드 함수는 부드러운 곡선이며 입력에 따라 출력이 연속적으로 변화

계단 함수는 0을 경계로 출력이 갑자기 변화

차이점 2

계단 함수가 0과 1 중 하나의 값 반환

시그모이드는 0과 1 사이의 실수를 반환

공통점

입력이 작을 때 출력은 0 입력이 커지면 출력이 1이 되는 구조

입력이 아무리 작거나 커도 출력은 0에서 1 사이의 값

 

3.2.6 비선형 함수

시그모이드 함수와 계단 함수는 비선형 함수로 분류됩니다.

비선형 함수는 문자 그래도 '선형이 아닌' 함수 입니다.
신경망에서는 활성화 함수로 비선형 함수를 상용해야 합니다.

 

3.2.7 ReLU함수 Rectified Linear Unit

0이하이면 0을 출력하는 함수 

0 을 넘으면 그 입력을 그대로 출력 

def relu(x):
    return np.maximum(0,x)

maximum 두 입력 중 큰 값을 선택해 반환하는 함수 입니다. 

 

3. 다차원 배열의 계산

3.3.1 다차원 배열

import numpy as np
A = np.array([1,2,3,4])
print(A)
print(np.ndim(A))
print(A.shape)
print(A.shape[0])

배열의 차원 수 np.ndim()

배열의 형상은 인스턴스 변수인 shape으로 알 수 있십니다.

import numpy as np
B = np.array([[1,2],[3,4],[5,6]])
print(B)
print(np.ndim(B ))
print(B.shape)
print(B.shape[0])

2차원 배열은 특히 행렬matrix이라고 부르고 , 가로 방향을 행, 세로 방향을 열 이라고 합니다.

 

3.3.2 행렬의 곱

 

1 2
3 4

 

5 6
7 8

 

19 (1 * 5 + 2 * 7 ) 22
43 (3 * 5 + 4 * 7) 50
A = np.array([[1,2,3],[4,5,6]])
B = np.array([[1,2],[3,4],[5,6]])
print(np.dot(A,B))

matrixmultiplication.xyz/

 

Matrix Multiplication

 

matrixmultiplication.xyz

 

3.3.3 신경망에서의 행렬 곱

 Y = np.dot(X,W)

 

3.4 3층 신경망 구현하기 

 

3.4.1 표기법 설명

 

3.4.2 각 층의 신호 전달하기 

A1 = np.dot(X,W1)+ B1

identity_function() 항등함수 입력을 그대로 출력하는 함수

출력층의 활성화 함수는 σ() 로 표현 (은닉층의 활성화 함수 h())

 

3.4.3 구현 정리

forward()라는 함수를 정의합니다. 

forward라 한 것은 신호가 순방향(입력에서 출력 방향)으로 전달됨(순전파)을 알리기 위함입니다. 

역방향(backward)

 

3.5 출력층 설계하기 

신경망은 분류와 회귀 모두에 이용할 수 있습니다. 

회귀에는 항등 함수

분류에는 소프트맥스 함수 

 

3.5.1 항등함수 와 소프트맥스 함수 구현하기

항등함수는identity function  입력을 그대로 출력합니다.입력과 출력이 항상 같다

소프트맥스 함수  softmax 함수 

지수함수 exponential function 

출력 층의 각 뉴런이 모든 입력 신호에서 영향을 받기 때문입니다

def softmax(a):
	exp_a = np.exp(a)
    sum_exp_a = np.sum(exp_a)
    y = exp_a / sum_exp_a
	return y

 

3.5.2소프트맥스 함수 구현시 주의점

오버플로 문제가 생길 수 있다. 

softmax()

np.exp(a-c) / np.sum(np.exp(a-c))

개선 된 수식 

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c) #오버플로 대책
    sum_exp_a = np.sum(exp_a)
    y = exp_a/ sum_exp_a
    return y

a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y)
print(np.sum(y))

 

3.5.3 소프트 맥스 함수의 특징

소프트함수의 출력은 0에서 1.0 사이의 실수입니다. 소프트맥스 함수 출력의 총합은 1입니다. 

총합이 1인 것은 중요한 성질입니다. => ' 확률'로 해석할 수있습니다. 

주의점으로 , 소프트맥스 함수를 적용해도 각 원소의 대소 관계는 변하지 않습니다.

결과적으로  신경망으로 분류할 때는 출력층의 소프트맥스 함수를 생략해도 됩니다 .

 

3.5.4 출력층의 뉴런 수 정하기

출력층의 뉴런 수는 풀려는 문제에 맞게 적절히 정해야 합니다. 

분류에서는 분류하고 싶은 클래스 수로 설정하는 것이 일반입니다. 

 

3.6 손글씨 숫자 인식

이미 학습된 매개변수를 사용하여 학습 과정은 생략하고 , 추론 과정만 구현할 겁니다.

이 추론 과정을 신경망의 순전파 forward propagation라고도 합니다.

 

3.6.1 MNIST 데이터 셋 

이미지 인식이나 기계학습 논문들을 읽다 보면 실험용 데이터로 자주 등장하는 것을 확인할 수 있습니다.

import sys, os
sys.path.append(os.pardir) #부모 디렉터리의 파일을 가져올 수 있도록 설정
from dataset.mnist import load_mnist

(x_train, t_train) , (x_test, t_test) = \
    load_mnist(flatten = True, normalize = False)

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

 

normalize는 입력 이미지의 픽셀 값을 0.0 ~ 1.0 사이의 값으로 정규화 할지를 정합니다.

False로 설정하면 입력 이미지의 픽셀 은 원래 값 그대로 0 ~ 255 사이의 값을 유지합니다.

flatten은 입력 이미지를 평탄하게 , 즉 1차원 배열로 만들지를 정합니다. 

False로 설정하면 입력 이미지를 1 * 29 * 28 의 3차원 배열로 ,True로 설정하면 784 개의 원소로 이뤄진 1차원 배열로 저장합니다.

one_hot_label은 레이블을 원-핫 인코딩 형태로 저장할지를 정합니다.

 

import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, t_train) , (x_test, t_test) = mnist.load_data()
#x_train, x_test = x_train / 255.0, x_test / 255.0

print(x_train.shape)
print(t_train.shape)
print(x_test.shape)
print(t_test.shape)

배치 처리 

PIL python Image Library 모듈을 사용합니다. 이미지 표시에는 

reshape()메서드에 원하는 형상을 인수로 지정하면 넘피이 배열의 형상을 바꿀수 있습니다.

넘파이로 저장된 이미지 데이터를 PIL용 데이터 객체로 변환해야 하며 , 이 변환은 Image.fromarray()가 수행합니다.

 

3.6.2 신겸앙의 추론 처리

pickle파일 학습된 가중치 매개변수

정확도 

predict()함수는 각 레이블의 확률을 넘파이 배열로 반환합니다.

 

데이터를 특정 범위로 변환하는 처리를 정규화 normalization라 하고 

신경망의 입력 데이터에 특정 변화을 가하는 것을 전처리 pre-processing라 합니다.

 

3.6.3 배치 처리

range()함수는 range(start, end)처럼 인수를 2개 지정해 호출하면 start에서 end-1까지의 정수로 이뤄진 리스트를 반환합니다.

 

argmax()는 최대값의 인덱스를 가져옵니다.

aixs = 1 이라는 인수를 추가한것에 주의합시다. 

y = np.argmax(x, axis = 1)

 

배치 하나로 묶은 입력 데이터를 배치라고 합니다. 

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
02. 퍼셉트론  (0) 2020.09.21
01. 헬로 파이썬  (0) 2020.09.18

+ Recent posts