모두야

CH3) 신경망 - (1) 본문

밑.시.딥/1권

CH3) 신경망 - (1)

미미밍2 2021. 7. 8. 21:51
반응형

 

CH2) 퍼셉트론

 

이전 글에서 퍼셉트론에 대하여 정리하였다.

좋은 점은 이론상 컴퓨터가 수행하는 복잡한 처리도 퍼셉트론으로 표현이 가능했다.

나쁜 점은 가중치를 설정하는 부분에서는 여전히 사람이 수동으로 작업해야 한다는 것이였다.


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

 

왼쪽 그림  : 신경망 구조 = 입력층 - 은닉층 - 출력층

오른쪽 그림 : 퍼셉트론 복습

                  - 편향을 명시한 퍼셉트론의 모습이다. 

 

왼쪽 : 퍼셉트론 편향을 옮긴 식, 오른쪽: 활성화 함수 식

 

 

활성화 함수

퍼셉트론 -----> 신경망으로 바뀌는 과정

 

가중치가 달린 입력 신호와 편향의 총합을 계산한

 

a = b + w1*x1 + w2*x2 이며

 

y = h(a) 라고 하면

 

y가 0보다 크면 1 출력, 0보다 작으면 0을 출력한다.

 

각 원의 명칭은 [뉴런]=[노드] 이다.


3.2 활성화 함수

활성화 함수는 임계값을 경계로 출력이 바뀌는데, 이를 계단함수(step function) 라고 한다.

 

시그모이드 함수

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

 

계단 함수

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

# 넘파이 배열 지원       
def step_function(x):
	y = x>0
    return y.astype(np.int)
import numpy as np
x = np.array([-1.0,1.0,2.0])
y = x>0
print(x)
print(y)

>> [-1.  1.  2.]
>> [False  True  True]

y = y.astype(np.int)
print(y)
>> array([0,1,1])

넘파이 배열의 자료형을 변환할 때, astype( ) 메서드 활용한다. ex) np.int로 지정하면 정수로 지정이 된다.

 

계단 함수 그래프

import numpy as np
import matplotlib.pyplot as plt

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) # y축 범위 지정
plt.show()

계단함수, 시그모이드 함수 그래프

시그모이드 함수 그래프

def sigmoid(x):
    return 1 / (1+np.exp(-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()
계단 함수 시그모이드 함수
- 같은 모양이다.
- 입력이 작으면 0에 가까운 출력, 입력이 커지면 1에 가까운 구조이다.
- 출력은 0~1 사이이다.
비선형 함수이다.
0 또는 1 두가지 출력이다. 부드러운 곡선이다.
입력이 경계를 기준으로 갑자기 변함 입력에 따라 출력이 연속적으로 변함

ReLU 함수

신경망 분야에서 시그모이드 함수를 오래전부터 이용하였으나,

최근에는 ReLU 함수를 주로 이용한다.

입력이 0을 넘으면 입력 그래도 출력하고, 0 이하이면 0을 출력한다.

def relu(x):
	return np.maximum(0,x)
    
x = np.arange(-5.0,5.0,0.1)
y = relu(x)

plt.plot(x,y)
plt.ylim(-1,5.1)
plt.show()

넘파이의 maximum 함수를 이용하여 0과 x 입력 중 큰 값을 선택하여 반환한다.

0 보다 이하일 경우, 음수보다 0이 크므로 0이 반환된다. 반대로, 0이상일 경우 0보다 x 출력값이 더 크므로 x가 반환이 된다.


3.3 다차원 배열의 계산

import numpy as np
A = np.array([1,2,3,4])
print(A)
>> [1,2,3,4]
# 배열의 차원수
np.ndim(A)
>> 1
# 배열의 형상
A.shape
>>(4,)
A.shape[0]
>> 4

넘파이에서는 (1,4)를 (4,)로 표현하는 듯 하다.

 

행렬의 곱

# 1차원 배열의 곱...
A = np.array([[1,2],[3,4],[5,6]])
print(A.shape)
B = np.array([7,8])
print(B.shape)
>>(3, 2)
>>(2,)

dot = np.dot(A,B)
print(dot.shape)
print(dot)
>>(3,)
>>[23 53 83]

신경망의 내적

# 신경망의 내적
# 입력 X
X = np.array([1,2])
print(X.shape)
# 가중치 W
W = np.array([[1,3,5],[2,4,6]])
print(W)
print(W.shape)
# 출력 Y
Y = np.dot(X,W)
print(Y)

>>(2,)
>>[[1 3 5]
  [2 4 6]]
>> (2, 3)
>> [ 5 11 17]


 

 

반응형

'밑.시.딥 > 1권' 카테고리의 다른 글

CH4) 신경망 학습 - (2)  (0) 2021.07.23
CH4) 신경망 학습 - (1)  (0) 2021.07.15
CH3) 신경망 - (2)  (0) 2021.07.12
CH2) 퍼셉트론  (0) 2021.07.08
CH1)헬로 파이썬  (1) 2021.04.21