2020년 10월 2일 금요일

Day_03. MNIST 숫자인식 – 2

 인공신경망 예측비 품질 최소선

= 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 숫자인식 실습해보기

https://www.tensorflow.org/tutorials/quickstart/beginner

#!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 튜토리얼을 참고하세요.


댓글 없음:

댓글 쓰기