퍼셉트론이란?
-다수의 신호를 입력으로 받아 하나의 신호를 출력
-퍼셉트론은 0,1 두가지 신호만 가진다.
-입력신호(x1 , x2)가 뉴런에 보내질때 가중치(w1, w2)가 곱해진다.
-위에서 가중치가 곱해진 입력신호의 합들이 정해진 한계를 넘어야 뉴런을 활성화한다.
-넘어야하는 한계를 임계값이라 부른다.
-가중치가 클수록 그 입력값이 중요하다는 의미.
-편향은 뉴런이 얼마나 쉽게 활성화하느냐를 조정하는 매개변수
-가중치 설정은 사람이 수동으로 한다.(신경망이 이를 해결해준다.)
논리회로(AND 게이트)
-두 입력이 모두 1일때만 1을 출력
-나머지는 0을 출력
def AND(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:#0을 넘지 못한 경우
return 0
else:#0을 넘은 경우 뉴런 활성화
return 1
논리회로(NAND 게이트)
-위의 AND게이트를 뒤집은 것으로 두 입력이 모두 1일때만 0을 출력
-나머지는 1을 출력
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])#AND게이트와는 가중치와 편향의 부호만 다르다.
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
논리회로(OR 게이트)
-두 입력이 모두 0일때만 0을 출력
-나머지는 1을 출력
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2#AND와 편향만 부호가 다르다
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
논리회로(XOR 게이트)
-두 x값중 1개만 1이고 나머지 1개는 0일때만 1을 출력한다.
-XOR게이트는 단층이 아닌 다층으로 구현한다.
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
신경망이란?
-입력층,은닉층,출력층으로 나뉜다.
-신경망에서는 비선형 함수를 활성화 함수로 사용. (선형함수 사용시 신경망의 층을 깊게 하는 의미x)
-분류와 회귀에서 사용가능
분류란?
-데이터가 어느 집단에 속하는지 구별
회귀란?
-입력된 값에서 연속적인 값을 예측하는 것
활성화 함수?
-입력신호에서 가중치를 곱한 값들의 합에 편향을 더한값 y가 들어가서 뉴런이 '활성화'하는지 결정하는 함수
-이름 그대로 '활성화'를 결정.
-일반적으로 단층 퍼셉트론에서는 계단함수를, 다층퍼셉트론에서는 시그모이드와 갑튼 매끈한 함수를 사용.
활성화 함수->계단함수?
-입력이 0을 넘으면 1출력, 아니면 0 출력(0을 경계로 값이 바뀐다.)
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()
계단함수
활성화 함수->시그모이드 함수?
-h(x)=1/(1+exp(-x))
-계단함수에 비해서 매끄럽다.(입력에 따라 값이 연속적으로 바뀐다.)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
시그모이드 함수
활성화 함수 -> ReLu함수?
-input이 0을 넘으면 그대로 출력, 아니면 0을 출력
def relu(x):
return np.maximum(0, x)
소프트맥스 함수?
-분류 문제에서 사용하는 함수
-출력의 합이 1이 된다.
import numpy as np
def softmax(a):
exp_a=np.exp(a)
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)
--------------
[0.01821127 0.24519181 0.73659691]
3층 신경망 구현하기
입력층 2개, 은닉층1은 3개, 은닉층2는 2개, 출력층은 2개
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def indentify_function(x):
return x
X=np.array([1.0 , 0.5])#입력값
W1=np.array([#출력에서 은닉층1까지의 가중치
[0.1, 0.3 , 0.5],
[0.2, 0.4 , 0.6]
])
B1=np.array([0.1 , 0.2 , 0.3])#편향
A1=np.dot(X,W1)+B1 #가중치와 입력값을 곱하고 편향을 더해준다.
Z1=sigmoid(A1)#그리고 활성화 함수에 넣어준다.
print("입력층에서 은닉층1까지.")
print("A1출력 다음에 Z1출력")
print(A1)
print(Z1)
W2=np.array([#은닉1에서 은닉2까지의 가중치
[0.1 , 0.4],
[0.2 , 0.5],
[0.3 , 0.6]
])
B2=np.array([0.1,0.2])#은닉1에서 은닉2까지의 편향
A2=np.dot(Z1,W2)+B2#가중치곱하고 편향더하고
Z2=sigmoid(A2)#활성화함수 시그모이드로 ㄱㄱ
print("은닉층1에서 은닉층2까지.")
print("A2출력 다음에 Z2출력")
print(A2)
print(Z2)
W3=np.array([[0.1,0.3],[0.2,0.4]])
B3=np.array([0.1,0.2])
A3=np.dot(Z2,W3)+B3#가중치곱하고 편향더하고
Y=indentify_function(A3)#항등함수가 활성화함수
print("은닉층2에서 출력층까지.")
print("A3출력 다음에 Y출력")
print(A3)
print(Y)
---------------------------------------------------------------
입력층에서 은닉층1까지.
A1출력 다음에 Z1출력
[0.3 0.7 1.1]
[0.57444252 0.66818777 0.75026011]
은닉층1에서 은닉층2까지.
A2출력 다음에 Z2출력
[0.51615984 1.21402696]
[0.62624937 0.7710107 ]
은닉층2에서 출력층까지.
A3출력 다음에 Y출력
[0.31682708 0.69627909]
[0.31682708 0.69627909]
손글자 인식
import sys,os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist
from PIL import Image
#normalize는 입력이미지의 픽셀값을 0.0~1.0으로 정규화 할지 결정
#flatten은 입력이미지를 1차원배열로 만들지 결정한다.(원 핫 인코딩)
(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)
#PIL 이미지 분석 및 처리를 쉽게 할 수 있는 라이브러리
def img_show(img):
pil_img = Image.fromarray(np.uint8(img))#넘파이 배열은 PIL이미지로 변환
pil_img.show()
img = x_train[0]
label = t_train[0]
print(label)
print(img.shape)
img = img.reshape(28, 28)
print(img.shape)
img_show(img)
정규화란?
-데이터를 특정 범위로 변환하는 작업
전처리란?
-입력 데이터에 특정 변환을 가하는 것