su's
Perceptron 본문
퍼셉트론이란?¶
다수의 입력으로부터 하나의 결과를 내보내는 알고리즘
초기의 인공신경망으로 1957년 코넬 항공 연구소의 Frank Rosenblatt라는 사람이 고안해 내었다.
Dendrite : 이웃 뉴런에서 전기 신호를 받는다.
Synapse : 다른 뉴런과 Dendrite의 연결 부위에 있다. 전기신호의 세기를 재조정한다.
Soma (cell body) : Dendrite로부터 받은 여러 전기신호들을 모두 합친다.
Axon : Soma의 전위가 일정 이상이 되면 이웃 뉴런으로 전기 신호를 보낸다.
- 각 노드의 가중치와 입력치를 곱한 것을 모두 합한 값이 활성함수에 의해 판단되는데, 그 값이 임계치(보통 0)보다 크면 뉴런이 활성화되고 결과값으로 1을 출력한다. 뉴런이 활성화되지 않으면 결과값으로 -1을 출력
단층 Perceptron 날코딩 구현하기!¶
- AND 게이트 구현하기
In [1]:
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2]) # 0 아니면 1만 들어간다.
w = np.array([0.5, 0.5])
b = -0.7 #임계값 (b는 bias=치우쳤다의 약자)
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1]) #x[0]= 0,0을 집어 넣어라
print(str(xs) + " -> " + str(y)) #xs의 데이터 타입을 스트링으로 바꾸겠다.
- NAND 게이트 구현하기
In [2]:
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5,-0.5]) # 이부분을 채워주세요!
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = NAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
- OR 게이트 구현하기
In [3]:
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = 0 # 이부분을 채워주세요!
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
- XOR 게이트 구현하기
In [4]:
def XOR(x1, x2):
s1 = NAND(x1, x2) # 이부분을 채워주세요!
s2 = OR(x1, x2) # 이부분을 채워주세요!
y = AND(s1, s2) # 이부분을 채워주세요!
return y
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
다층 Perceptron 이해를 위한 개념¶
Activation Function¶
입력값을 비선형(non-linear)방식으로 출력값을 도출하기 위해 사용되는 함수
단층 퍼셉트론의 XOR (non-linear. 즉 선으로 나눌수 없는 한계) 방식을 해결하기 위해 등장한 개념
즉 다층 퍼셉트론은 linear 레이어를 여러개 쌓는데 아니라 활성화 함수를 이용해서 non-linear를 여러개 쌓는 것
Heaviside 함수 구현¶
In [5]:
# 숫자 1개에 대한 헤비사이드 함수
def step_function_simple(x):
if x>0:
return 1
else:
return 0
In [6]:
step_function_simple(1)
Out[6]:
In [7]:
step_function_simple(2)
Out[7]:
In [8]:
step_function_simple(-1)
Out[8]:
In [9]:
# 벡터(어떤 상수들의 집합)에 대한 헤비사이드 함수
import numpy as np
x=np.array([-1,1,2])
def step_function(x):
return np.array(x>0, dtype=np.int) #데이터 타입은 T,F 논리형이 아니라 정수형으로 나와야 함으로 바꾼다.
step_function(x)
Out[9]:
In [10]:
x>0
# -1은 0보다 크다는 F, 1은 0보다 크다는 T, 2는 0보다 크다는 T
Out[10]:
Sigmoid 함수 구현¶
$f(x)=\frac{1}{1+e^{-x}}$
-> 로지스틱 회귀분석 또는 Neural network의 Binary classification 마지막 레이어의 활성함수로 사용하는 시그모이드
In [11]:
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x)) # 이부분을 채워주세요!
In [12]:
sigmoid(2)
Out[12]:
In [13]:
sigmoid(3)
Out[13]:
In [14]:
sigmoid(-1)
Out[14]:
In [15]:
x
Out[15]:
In [16]:
sigmoid(x)
Out[16]:
Heaviside 함수 그래프 그리기¶
In [17]:
import numpy as np
import matplotlib.pylab 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()
In [18]:
np.arange(-5,5) #-5부터 5까지의 정수를 리스트로
Out[18]:
In [19]:
X = np.arange(-5.0, 5.0, 0.1)
X
Out[19]:
sigmoid 함수 그래프 그리기¶
In [20]:
import numpy as np
import matplotlib.pylab as plt
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()
heaviside 와 sigmoid 비교¶
In [21]:
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1 / (1+ np.exp(-x)) # 위에서 채운 것을 그대로 적어주세요!
def step_function(x):
return np.array(x > 0, dtype=np.int)
x = np.arange(-5.0, 5.0, 0.1)
y1 = sigmoid(x)
y2 = step_function(x)
plt.plot(x, y1)
plt.plot(x, y2, 'k--')
plt.ylim(-0.1, 1.1) # y축 범위 지정
plt.show()
Relu 함수 구현 및 그래프¶
$\begin{split}f(x) = \begin{Bmatrix} x & x > 0 \\ 0 & x <= 0 \end{Bmatrix}\end{split}$
In [22]:
import numpy as np
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0,x) # 이부분을 채워주세요! # 0과 x중에 더 큰값을 취하겠다.
x = np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x, y)
plt.ylim(-1.0, 5.5)
plt.show()
인공신경망 구조¶
In [23]:
def identity_function(x):
return x
def init_network(): #신경망 정의하기, 입력변수가 없어도 된다.
network ={} # 빈 딕셔너리 선언
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]]) # 딕셔너리에 내용물이 채워짐
network['b1'] = np.array([0.1,0.2,0.3])
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
network['b2'] = np.array([0.1,0.2])
network['W3'] = np.array([[0.1,0.3],[0.2,0.4]])
network['b3'] = np.array([0.1,0.2])
return network
def forward(network, x): #전기신호 전달 정의
W1, W2, W3 = network['W1'], network['W2'], network['W3']
b1, b2, b3 = network['b1'], network['b2'], network['b3']
a1 = np.dot(x,W1)+b1 #입력층에서 1층으로의 신호 전달 network['b3'] = np.array([0.1,0.2])
z1 = sigmoid(a1)
a2 = np.dot(z1, W2)+b2 # 1층에서 2층으로의 신호 전달
z2 = sigmoid(a2)
a3 = np.dot(z2, W3)+b3 # 2층에서 출력층으로의 전달
y= identity_function(a3) # 나중에 이부분을 소프트맥스로 바꿀 예정
return y
In [24]:
network = init_network()
x = np.array([1.0,0.5])
y = forward(network, x)
print(y)
softmax함수¶
In [25]:
def softmax(x):
if x.ndim == 2: # x는 2차원 이다. (행렬)
x = x.T
x= x.np.max(x, axis=0)
y= np.exp(x) / np.sum(np.exp(x), axis=0) # 이부분을 채워주세요!
return y.T
x = x- np.max(x) #오버플로 대책
return np.exp(x) / np.sum(np.exp(x)) # 소프트 맥스 함수의 핵심부분 채우기
'STUDY > 머신러닝 딥러닝' 카테고리의 다른 글
Gradient_Descent (0) | 2021.03.27 |
---|