딥러닝 4장. 신경망 학습
딥러닝2017. 7. 26. 10:51
- 4장 목차
- 신경망의 학습이 무엇인가?
- 비용함수(손실함수) 2가지
- 평균 제곱 오차
- 교차 엔트로피 오차
- 미니 배치 학습
- 수치 미분
- 편미분
- 기울기
- 경사하강법
- 신경망에서의 기울기
- 학습 신경망 구현하기
■ 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 머신러닝) 이라고 한다 .
↓
이미지, 영상을 던져주고 알아서 분석
■ 훈련데이터와 시험 데이터
학습(훈련) 데이터에 너무 지나치게 맞추다 보면 일빈화 성능이 떨어지는 것을 과적합이라고 한ㄷㅏ.
- 평균 제곱 오차
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
- 교차 엔트로피
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] |
정리 :
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 |