모두야
CH3) 신경망 - (1) 본문
이전 글에서 퍼셉트론에 대하여 정리하였다.
좋은 점은 이론상 컴퓨터가 수행하는 복잡한 처리도 퍼셉트론으로 표현이 가능했다.
나쁜 점은 가중치를 설정하는 부분에서는 여전히 사람이 수동으로 작업해야 한다는 것이였다.
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 |