Quiet Time

  • 4장 목차
  1. 신경망의 학습이 무엇인가?
  2. 비용함수(손실함수) 2가지
     - 평균 제곱 오차
     - 교차 엔트로피 오차
  1. 미니 배치 학습
  2. 수치 미분
  3. 편미분
  4. 기울기
  5. 경사하강법
  6. 신경망에서의 기울기
  7. 학습 신경망 구현하기 
■ 1. 신경망의 학습이 무엇인지? 

- 학습이란 ? 신경망에서 우너하는 결과를 얻기 위해 뉴런 사이의 적당한 가중치를 알아내는것을 말한다.
          즉, 가중치를 최적화 하는 것이다. 
     - 퍼셉트론에서는 가중치 매개변수를 사람이 수작업으로 설정했다.
          왜냐면 매개변수가 겨울 3개였기 때문이다. 
     예 : and 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
           or 연산의 가중치 : 0.5 , 0.5  세타 : 0.7
     
     그러나 신경망에서는 매개변수가 몇개가 될까

     어제 구현한 mnist의 가중치도 은닉층 1만 50개, 은닉층 2가 100개 였다. 
     층이 더 깊어지면 수억에 이를 수도 있기 때문에
     
     사람이 일일이 수작업을 할 수가 없다. 
     이미지(필기체) 숫자 5를 기계가 인식하게 하는 방법 3가지 ? (p110)

1.5 ----------- 사람이 생각한 알고리즘 ------------> 결과
2.5 ----------- 사람이 생각한 특징   -- 기계학습 ---> 결과
               (sift, hog 등)       (svm, knn)
3.5 ----------- 신경망(딥러닝) -------------------> 결과

딥러닝을 종단간 기계학습(end-to-end 머신러닝) 이라고 한다 .
                         ↓
                         이미지, 영상을 던져주고 알아서 분석

■ 훈련데이터와 시험 데이터 
학습(훈련) 데이터에 너무 지나치게 맞추다 보면 일빈화 성능이 떨어지는 것을 과적합이라고 한ㄷㅏ.



  1. 평균 제곱 오차

import numpy as np

def mean_squared_error(y, t):
    return 0.5 * np.sum((y-t)**2)
t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(np.shape(t))
print(np.shape(y))
print(mean_squared_error(np.array(y),np.array(t)))

y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(mean_squared_error(np.array(y),np.array(t)))
결과 :
0.0975
0.2725

  1. 교차 엔트로피 

import numpy as np
def cross_entropy_error(y,t):
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

t = [0,0,1,0,0,0,0,0,0,0]
y = [0.1, 0.05, 0.6 ,0.0, 0.05, 0.1 , 0.0 , 0.1, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
y = [0.1, 0.05, 0.1 ,0.0, 0.05, 0.1 , 0.0 , 0.6, 0.0, 0.0]
print(cross_entropy_error(np.array(y),np.array(t)))
결과 :
0.510825457099
2.30258409299

설명 : 정답 레이블과의 오차가 mse 보다 훨씬 더 큰 것으로 확인이 되고 잇ㄷ.

문제67. (점심시간문제) 아래의 넘파이 배열(확률)을 교차 엔트로피 오차 함수를 이용해서 
     오차율이 어떻게 되는지 for loop 문을 사용해서 한번에 알아내시오 !



t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  
y2 = [0.1,0.05,0.2,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y3 = [0.0,0.05,0.3,0.0,0.05,0.1,0.0,0.6,0.0,0.0] 
y4 = [0.0,0.05,0.4,0.0,0.05,0.0,0.0,0.5,0.0,0.0] 
y5 = [0.0,0.05,0.5,0.0,0.05,0.0,0.0,0.4,0.0,0.0] 
y6 = [0.0,0.05,0.6,0.0,0.05,0.0,0.0,0.3,0.0,0.0] 
y7 = [0.0,0.05,0.7,0.0,0.05,0.0,0.0,0.2,0.0,0.0] 
y8 = [0.0,0.1,0.8,0.0,0.1,0.0,0.0,0.2,0.0,0.0] 
y9 = [0.0,0.05,0.9,0.0,0.05,0.0,0.0,0.0,0.0,0.0]


정리 :
1.one-hot-encoding = False
  입력값 ----> 신경망 ----> 출력값 (숫자) ---> 라벨 비교 ---> 정확도
                                             
                                             숫자가 맞냐 안맞냐  
2.one-hot-encoding =True
  입력값 ----> 신경망 ----> 소프트맥스 함수 ---> 출력값(확률) ---> 비용함수 
                                                              ↓
                                                             오차 
                                                            0.23, 0.59
 
정확도를 올리거나 오차를 낮추거나 해야해요 

정확도보다 오차를 보는게 더 유용한 이유 . 

정확도는 23 24이렇게 생겼는데

오차는 0.2424, .54

매개변수값에 예민한것 => 비용함수의 값


0.23.
0.21 
0.19
비용함수에 넣고 오차를 구하는것이 더 학습에 유리하다 . 

매개변수에 더 잘 반응 함 . 

□ 4.3 미니 배치 학습

미니배치 학습이란 훈련 데이터로 부터 일부만 골라서 학습을 수행하는 방식이다.

앞에서 손실함수를 배웠는데 손실함수가 필요한 이유는 
예상값과 실제값을 오차를 계산해서 오차를 줄이는 방향으로 
가중치를 조정하려고 필요했다. 

지금까지는 딱 하나의 데이터만 가지고 손실함수 계산을 한 것이었다. 

t = [0,0,1,0,0,0,0,0,0,0]    # 숫자2

y1 = [0.1,0.05,0.1,0.0,0.05,0.1,0.0,0.1,0.0,0.0]  

mnist 데이터만 해도 훈련데이터가 6만장인데 ---> 비용함수 
                                     계산

한장씩 입력하면 계산을 6만번을 해야하기 때문에 여러장을 모아서 입력하고 계산을 한번만 하게 하자 
  
이것이 미니배치 학습입니다. 

훈련데이터 중 일부만 골라서 학습 하는 방법 : 표본을 뽑아서 학습 한다. 

표본을 뽑아서 학습 시키는 장점 :

한번에 넣어서 한번에 계산하게함 == 미니배치학습

mnist 데이터를 가지고 미니배치 학습을 시켜보자 


문제68
6만 미만의 숫자중에 무작위로 10만 출력하시오

print(np.random.choice(60000, 10))

문제69. mnnist 60000장의 훈련 데이터 중에 무작위로 10장을 골라

import sys, os
sys.path.append(os.pardir)  # 부모 디렉터리의 파일을 가져올 수 있도록 설정
import numpy as np
import pickle
# (p98) mmist 데이터셋을 읽어올 때 인터넷이 연결되어 있는 상태에서 가져와야하는데 이때 시간이 걸린다.
# 가져온 이미지를 로컬에 저장할 때 pickle 파일로 생성이 되고 로컬에 저장되어 있으면 순식간에 읽을 수 있기 때문에 임포트 해야함
from dataset.mnist import load_mnist
from common.functions import sigmoid, softmax


(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)

print(x_train.shape)
print(t_train.shape)

train_size = 60000
batch_size = 10
batch_mask == np.random.choice(   train_size ,  batch_size   )
x_batch = x_train[batch_mask]
t_batch = x_train[batch_mask]

print(len(x_batch)) # 10
print( x_batch.shape) 

문제70. 데이터 1개를 가지고 오차를 구하는 교차 엔트로피 오차 함수는 아래와 같이 만들었다.
     그렇다면 배치용 교차 엔트로피 오차는 어떻게 생성해야 하는가 ? 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta))

답 : 

import numpy as np

def corss_entropy_error(y, t):
     delta = 1e-7
     return -np.sum(t * np.log(y + delta)) / len(y)

문제71. SK PT 64 페이지를 참고해서 교차 엔트로피 오차 사용 코드를 구현하시오 ! 
(mnist 데이터셋의 테스트 데이터를 가지고 구현) 














언제 몇시까지 ?

몇시까지 갈게영! 

되물어여! 

잘 못들었을때 한번더 ㅋ캐캐캐캨



정보조사

홈페이지 인재상 기업연역 
대표인사 ?


열정 리더쉬 키워드 ㅋㅋ

아이티는 앙데 

아이티는 사업영역
 아이티는 
내가 사용한적있는 제품? 

고객사? 

솔루션 제품 
솔루션 제품 의 기능 

블로그나 카페? 

최근 게시글 릭고가 여 ㅇ ㅋ


나에 맞추어서 질문 준비 

복장 






속도 =  거리 / 시간
df(x) / dx = 

속도는 거리를 시간으로 나눈것인데 순간 속도는 시간이 한없이 0 으로 가는 멈춰있는 그  특정 순간의 속도를 말한다.

고등학교 때 배운 미분을 컴퓨터 구현하면 문제가 생긴다. 왜냐면 시간이 0 은 아닌데 0 에 무한히 가까워지는 그 수식을 표현하려면 
0.00000000 .... 000001 로 표현해야 한다.

print( np.float32(1e-50))
결과 0.0

그래서 그냥 0.0001로 표현할 수 밖에 없다. 

 h 를 0으로 좁히는 게 불가능 하다 보니
  df(x)            f(x+h) - f(x)           f(x+h) - f(x-h)
--------- = limit --------------- = limit -------------------
   dx        h->0        h           h->0      2 * h
                         ↓                      ↓
                    진정한 미분식            근사로 구한 접선 (수치미분) 


 


문제72. 근사로 구한 미분 함수를 파이썬으로 구하시오 
       ( h - 0.0001 ) 함수 이름 : numerical_diff
      f(x+h) - f(x-h)
limit ----------------
 h->0       2 * h

답 : 

def numerical_diff(f,x):
     h = 0.0001
     return ( f(x+h) - f(x-h) / (2*h) 

문제73.  y= 0.01 * x^2 + 0.1 * x 함수를 미분하는데 x 가 10일때 미분 계수는 어떻게 되는가 ?

def func73(x):
    return 0.01 * x ** 2 + 0.1 * x

def numerical_diff(f,x):
     h = 0.0001
     return (f(x+h) - f(x-h)) / (2*h)
print(numerical_diff(func73,10))

0.2999999999986347
































'딥러닝' 카테고리의 다른 글

딥러닝 5장 .  (0) 2017.07.26
딥러닝 3장. 신경망  (0) 2017.07.26
딥러닝 2장. 퍼셉트론  (0) 2017.07.26
딥러닝 1장. Numpy, matplotlib 사용법  (0) 2017.07.26