인공신경망 예측비 품질 최소선
= 95%이상이 되야 활용 가능한 수치적 비율
=사람이 인식 하는 비율 수치가 95%정도
딥러닝의 학습방법
=회귀분석의 y=AX+B 의 weight(가중치)와 bias(절편)을 잘 찾아내는 것
용어정리
순전파(forward propagation) |
입력에서 출력까지 연산이 이어지는 과정 |
손실함수(loss function) |
실제값과 예측값의 차이를 수치화 해주는 함수=추정치 구하는기능, 추정치가 작아야 함수가 정확함 |
MSE(Mean Squared Error) |
오차 제곱의 평균값 |
크로스 엔트로피(Cross – Entropy) |
낮은확률로 예측해서 맞추거나 높은 확률로 예측해서 틀리는 경우 발생하는 Loss가 크다. 0,1로 나뉘는 이진분류(Binary classification)의 경우 binary crossentropy를 사용 다중 클래스 분류(multi class classification)의 경우 categorical cross entropy를 사용한다) |
전결합층(fully connected layer, danse layer) |
은닉층과 출력층의 모든 뉴런이 연결되어 있는 상황을 “다중퍼셉트론” 이라 한다, 이와 같이 특정 layer의 모든 뉴런이 이전층의 모든 뉴런과 연결되어 있을 때 이를 “전결합층” 이라 한다 |
활성화 함수(activation function) |
Sigmoid , relu softmax등 은닉층과 출력층의 뉴런에서 출력값을 결정하는 함수 특징 = 비선형함수(non linear function) = 딥러닝에는 선형함수가 없다 |
딥러닝의 학습방법 실습
Numpy 와 matplotlib import |
import numpy as np import matplotlib.pyplot as plt |
계단함수 실습
Step function 이제는 거의 사용하지 않음 퍼셉트론을 통해 처음 인공신경망 학습시 접하게 되는 활성화 함수 |
def step(x): return np.array(x>0,dtype=np.int) x = np.arange(-6.0 , 6.0 , 0.1) #-6.0에서 6.0까지 0.1 간격 생성 y = step(x) plt.title('Step Function') plt.plot(x,y) plt.savefig('step_function.png', bbox_inches='tight') plt.show() |
시그모이드 함수 실습
Sigmoid function 시그모이드 함수를 사용하는 은닉층의 개수가 다수일 때 0에 가까운 기울기가 계속 곱해지면 앞단에서는 거의 기울기를 전파받을 수 없게 된다 매개변수 w가 업데이트 되지않아 학습이 되지않음 =기울기 소실(vanishing gradient 문제) |
def sigmoid(x): return 1/(1+np.exp(-x)) x = np.arange(-6.0,6.0, 0.1) y = sigmoid(x) plt.plot(x,y) plt.plot([0,0],[1.0,0.0],':') # 가운데 점선 추가 plt.title('Sigmoid function') plt.savefig('sigmoid_function.png', bbox_inches='tight') plt.show() |
하이퍼볼릭 탄젠트 함수
Hyperbolic tangent function =tanh 함수 하이퍼볼릭 탄젠트 함수는 입력값을 -1과 1 사이의 값으로 변환 -1과 1 에 가까운 출력값을 출력할 때 시그모이드 함수와 같은 문제가 발생 하지만 중심점을 0으로 하고 있는 특징으로 시그모이드 함수와 비교하면 변화폭이 크다 시그모이드 함수보다 기울기 소실 증상이 적다, 은닉층에서 시그모이드 함수보다는 많이 사용 |
x = np.arange(-6.0,6.0,1.0) y = np.tanh(x)
plt.plot(x,y) plt.plot([0,0],[1.0,-1.0], ':') plt.axhline(y=0,color='orange',linestyle='--') plt.title('Tanh Function') plt.savefig('Tanh_function.png', bbox_inches='tight') plt.show() |
렐루함수
인공신경망에서 가장 최고의 인기를 얻고 있는 함수 F(x)=max(0,x)로 간단 음수를 입력하면 0을 출력하고 양수는 그대로 반환 특정양수값에 수렴하지않아 시그모이드 함수보다 더 잘작동 연산이 아닌 단순 임계값으로 연산속도가 빠름 입력값이 음수면 기울기도 0이된다, 이 뉴런은 다시 회생하는게 어려워 죽은 렐루(dying Relu라고함) |
def relu(x): return np.maximum(0,x)
x = np.arange(-6.0,6.0,0.1) y = relu(x) plt.plot(x,y) plt.plot([0,0],[5.0,0.0],':') plt.title('Relu Function') plt.savefig('Relu_function.png', bbox_inches='tight') plt.show() |
리키렐루
Leaky_Relu 죽은 렐루를 보완하기 위한 Relu의 변형 함수가 등장 입력값이 음수일경우 0이아니라 0.001등 매우 작은 수를 반환한다 F(x)=max(ax,x)로 간단한 수식 A는 “하이퍼파라미터”로 leaky(‘새는’) 정도를 결정하며 일반적으로 0.01을 가짐 새는정도는 입력값의 음수일 때 기울기를 의미 |
a=0.1 def leaky_relu(x): return np.maximum(a*x,x) x = np.arange(-6.0,6.0,0.1) y = leaky_relu(x) plt.plot(x,y) plt.plot([0,0],[5.0,0.0],':') plt.title('Leaky Relu Function') plt.savefig('Leaky_Relu_function.png', bbox_inches='tight') plt.show() |
Softmax 함수
Softmax 함수 은닉층에서 relu 또는 relu의 변형을 사용하는게 일반적이나 분류문제를 로지스틱 회귀와 소프트맥스 회귀를 출력층에 적용해서 사용한다 |
x = np.arange(-6.0,6.0,0.1) y = np.exp(x) / np.sum(np.exp(x)) plt.plot(x,y) plt.title('Softmax Function') plt.savefig('Softmax_function.png', bbox_inches='tight') plt.show() |
옵티마이져 = Optimizer 정리
손실함수의 값을 중여나가며 학습할떄 어떤 옵티마이저를 사용하는지 정하는게 중요하다 |
배치(batch)의 종류와 정의
모두 2000개의 data가 있을 때 10 묶음으로 소분한다고 해보자 이때 iteration 은 10, 한묶음 (1 iteration)에는 200개의 data가 있다, 이를 batch 라고 한다 |
배치경사 하강법
Batch gradient descent |
오차 계산시 전체 data를 고려한다, 1회의 훈련(에포크)에서 모든 배계변수 업데이트를 1회 수행 |
전체 data를 대상으로 진행하기 때문에 시간이 오래걸리고 메모리를 많이 사용하나 글로벌 미니멈을 찾을수 있다 |
확률적 경사 하강법
Srochastic Gradient Descent SGD |
배치경사 하강법과는 다르게 랜덤하게 선택한 DATA에 대해서 실시 |
적은 DATA 수로 빠르게 계산이 가능함, 변경폭이 불안정하고 정확도는 낮을수 있음 |
미니배치경사 하강법
Mini batch gradient descent |
정해진 양에 대해서만 계산해 매개변수 값을 조정 |
배치경사 하강법보다 빠르고 SGD보다 안정적, 실제로 많이 사용한다 |
모멘텀
Momentum |
SGD에 관성을 더해서 사용한다 |
SGD에서 계산된 접선의 기술기에 한 시점(STEP)의 접선의 기술기값이 반영되어 LOCAL 미니마에 빠져도 관성의 힘으로 탈출가능 |
아다그라드
Adagrad |
모든 매게변수에 동일한 학습률을 적용시키는 것은 비효율적임, 아다그라드는 각 매개변수에 다른 학습률을 적용시킨다 |
변화가 많은변수는 학습률이 적게, 변화가 적은 것은 많은 학습률을 적용함 |
알엠에스프롭
RMSprop |
아다그라드의 단점인 학습 시간이 길어지면 학습률이 떨어지는데 이를 다른 수식으로 재체해서 보강함 |
아담
Adam |
RMSprop 과 Momentum을 합친 방법으로 방향과 학습률 두가지를 모두 잡는다 |
에포크
전체 data에 대해 순전파 & 역전파가 끝난 상태, 너무많으면 과적합, 적으면 과소적합이 발생한다
Tensorflow 숫자인식 실습해보기
#!pip install -q tensorflow-gpu==2.0.0-rc1 import tensorflow as tf |
=== MNIST 데이터셋을 로드하여 준비합니다. 샘플 값을 정수에서 부동소수로 변환합니다: |
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 |
===층을 차례대로 쌓아 tf.keras.Sequential 모델을 만듭니다. 훈련에 사용할 옵티마이저(optimizer)와 손실 함수를 선택합니다: |
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) |
=== 모델을 훈련하고 평가합니다: |
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2) |
Epoch 1/5 1875/1875 [==============================]
- 3s 1ms/step - loss: 0.2925 - accuracy: 0.9155 Epoch 2/5 1875/1875
[==============================] - 3s 1ms/step - loss: 0.1411 - accuracy:
0.9585 Epoch 3/5 1875/1875
[==============================] - 2s 1ms/step - loss: 0.1057 - accuracy:
0.9679 Epoch 4/5 1875/1875
[==============================] - 3s 1ms/step - loss: 0.0856 - accuracy:
0.9735 Epoch 5/5 1875/1875
[==============================] - 3s 1ms/step - loss: 0.0733 - accuracy:
0.9766 313/313 - 0s - loss: 0.0734 - accuracy:
0.9776 Out[9]: [0.07340522110462189,
0.9775999784469604]
|
=== 훈련된 이미지 분류기는 이 데이터셋에서 약 98%의 정확도를 달성합니다. 더 자세한 내용은 TensorFlow 튜토리얼을 참고하세요. |
댓글 없음:
댓글 쓰기