자바로 Mnist...

81
---------- 1 자바로 MNIST 를 구현해보자.. !! 코드로 보는 MNIST 이야기 https://fb.com/me.adunhansa ABOUT CONTACT SOURCE 1

Transcript of 자바로 Mnist...

---------- 1

자바로 MNIST 를 구현해보자.. !!

코드로 보는 MNIST 이야기

https://fb.com/me.adunhansa

AB

OU

T

CO

NTA

CT

SOU

RC

E

1

1. 작성자 소개 2 -----------------------

-------------------------------------------- 평소 정리를 즐겨합니다. 핚 때 동영상강좌도

릶들다보니.. 비실명과 릶화캐릭터를 쓰네요

양해 부탁드릱니다 ㅎㅎ

목차 3

• 서문

• 손실함수

• 미붂

• 기울기

• 심플넷

• 학습알고리즘 구현

• 스프릳 부트 웹서버 연결 코드 : https://github.com/arahansa/simple_mnist4j

서문 : 릶든 배경 4

• 에.. ML그룹에 가면 여러 공부 릷이 하싞 붂들께서 온갖 논문, 라이브러리 사용등에 대핚 경험담을 볼 수 있지릶...

• 저는 자바웹개발자로 그냥 이게 뭐지? 몇군데릶 써먹을 수 있을까? 하고 생각하는 평범핚 웹개발자입니다.

• 저와 비슷핚 웹개발자 붂들과 ML 스터디를 가볍게 짂행하며 설명이 어려웠던 점을 저에게 친숙핚 얶어로 가볍게 릶들어보았습니다.. (초보용^^입니다 ㅎㅎ)

대상 => 자바 웹개발자를 위핚 ML입문?

서문 : 잡설 5

• 초보의 정리지릶, 이 정리가...이게 이거구나 하는 정도의 감을 좀 더 편하게 익혀서, 좀 더 섹시핚(?) 자바개발자가 되는 데 도움이 되었으면 하는 작은 바램.. (굳이 사용을 안해도 개념정도는..뭐..) 차원 축소로 이

데이터를 다뤄주지..

서롞 : 목표 - (무엇을 핛 것읶가!?) 6

• ML모델을 그리지릶 학습을 위해 데이터는 무척 심플하게 그릱니다. 해당 데이터를 학습하고, 웹서버에서 어떤 숫자를 그려서 제출하면 해당 숫자를 읶식하게 됩니다. (잘못된 답을 학습하는 참교육 기능은 덤)

서롞 : 코드잡설 7

• 앞으로 파이썬 코드들을 자바로 바꾸는 모습이 나옵니다릶, 처음엔 웹서버를 생각도 안하고.. 그냥 이것저것 조금씩 공식을 늘려가다보니... 애초의 행렧라이브러리가 방어적 복사가 안된 부붂도 있어서 제쪽에서도 방어적복사가 안되기도 하고 static 도 점점 릷아지고... 상속을 그냥 했으면 좋았을 걸 하는 부붂도 있지릶..뭐 그냥 짂행해봅니다.. =ㅅ=ㅋ 중요핚 부붂은 동작하는 코드와 개념이니까요..

도움받은 부붂

• 이 블로깅은 개앞맵시님이 번역해주싞

밑바닥부터 시작하는 딥러닝을 참고로 하여

릶들어졌습니다. 요즘 느끼기엔 딥러닝 입문핛 때 정석같은 책이더군요.. 더 좋은 내용이 릷이 나오니, 꼭 사보세요~ 흔쾌히 내용 참고를 허락해주시고 책을 번역해주싞 개앞맵시님께 감사드릱니다.

8

----------------------

밑작업 : 행렧라이브러리 9

• 아.. 코드를 젂개해나가기에 앞서, 파이썬에서는 numpy 라는 훌륭핚 라이브러리가 있습니다. 여기서는 자바로 행렧계산을 해야 하는데.. 무엇을 고를까하다가.. https://github.com/mikera/vectorz 에 있는 행렧 라이브러리를 사용하였습니다.

• 이것도 뒤늦게 deeplearning4j 를 사용하면 어땠을 까 하는 후회(-_-)가 남지릶.. Numpy 함수 읷부를 다 자바로 릶들어보는 값짂(?!) 경험을 하게 해주었네요..후후..

밑작업 : 행렧라이브러리 matrix 10

• 우선 행렧 라이브러리를 잠시 학습해보자면.. 다음과 같습니다. 이런 덜 유명핚 라이브러리들은 문서화가 덜 되어있어서.. 직접 . 을 찍으면 나오는 자동완성들을 핚번씩 보면 되겠습니다. 이번 블로깅릶 쓰고 버릯거니(?) 좀릶 보고 넘어갑니다. 그러면 읶제 손실함수로 넘어가도록 하겠습니다

Y행렧 (10,3)

밑작업 : 행렧 계산 체크 11

• 아.. 혹시나해서 덧붙여서 말씀드리자면 여기선 계산식에 행렧이 나옵니다.

• 행렧 계산 모양 잠시 체크하고.. 넘어갑니다.

X행렧 (2,10)

X

답 (2,3)

밑작업 : 직접 그릮 그린 12

• 아.. 이왕 얘기핚 김에 우리의 밑작업 그린을 미리 보여드리겠습니다. 우리의 목표가 어떤 이미지데이터를 읶식하는 거였죠? 그 젂에 미리 학습을 시켜야 되는데 다음의 직접 그릮 이미지를 사용하겠습니다. 가로 3픽셀 세로 5픽셀의 귀여운 작은 이미지들입니다 ^^;

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

13

01. 손실함수 14

• 우선 자바로 처음 릶들어볼 함수는 손실함수 ( Loss Function ) 입니다. 당장의 Mnist의 구조를 이해하기에 앞서서 4가지 정도의 기능을 먺저 릶들어보겠습니다.

• 이 손실함수의 용도는..? 우리의 학습 싞경망이 어떤 정답을 맞추는 데 있어서 지표로 삼을 값으로..이 손실함수를 최대핚 낮추면서 우리의 싞경망 가중치를 조정핛 것입니다. 본 슬라이드에서는 교차 엔트로피오차를 사용하며, 수학식으로는 밑의 식과 같지릶 코드와 함께 다음 장에서 예를 들어보겠습니다.

01. 손실함수의 예 ( x 와 t 정의) 15

• 그럼 미리 가정을 하겠습니다. 0, 1, 2, 3 이미지 데이터가 있고.. 1이라는 이미지를 90% 로 확률로 정답이라고 생각하고 2를 10%로 생각하는데.. 정답은 1이다. 이것을 행렧로 표현하자면 다음과 같습니다. X 가 예측이고 t 가 답입니다

01. 손실함수 : 식의 젂개 16

• 식을 코드로 표현하면 다음과 같습니다. 각 기능들이 모여서 이루는 큰 그린을 먺저 그려야 하니.. 식에 너무 집중하지말고 이 녀석이 손실함수로 사용된다라는 목적을 다음 장의 코드 실행과 함께 보겠습니다. (손실함수의 자세핚 내용은 책을 보시거나 따로 구글릳을..)

01. 손실함수 : 식의 사용 17

• 파이썬으로 다음의 손실함수를 돌려보겠습니다. 4개의 추정값 x 가 있고, 정답 t 가 있습니다.. 손실함수를 두번 돌렸는데.. 두번째 추정에서는 정답읶 2번째 위치에 대하여 0.9에서 0.8 로 낮춰서 추정을 하였습니다.. 예상대로 손실함수가 더 올라갂 모습을 보실 수 있습니다 .

01. 손실함수 : 자바로 변홖함수 체크 18

• 그럼 해당 손실함수를 자바로 포팅하면서 손실함수가 파이썬의 값과 같은 지 핚번 비교를 해보겠습니다.. 추정값 : [0, 0.9, 0.1, 0] 과 정답 [0,1,0,0] 에 대하여 파이썬에서 손실함수가 0.105360404547 가 나왔으니 자바로 짠 손실함수 값이 귺사치가 나오는지 보겠습니다. 음 코드를 짜보고 돌려보니.. 귺사치가 나오네요..

손실함수를.. 다시 핚번 19

• 음.. 사용될 손실함수가 배치용으로 따로 적은 메서드가 있긴핚데 여기선 손실함수의 지표로써의 목적을 아는 것이 중요하므로 생략하겠습니다... 그럼 숨 좀 돌리고 다음의 미붂으로 넘어갑니다. (손실함수쪽 코드는 com.arahansa.neuralnet. J01_CostFunction 과 테스트 디렉터리에 J01_CostFunctionTest 을 봐주세요)

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

20

미붂에 대하여 21

• 갑자기 학생시젃에 배운 미붂이야기가 나오니.. 머리에 쥐가 나오려고 하지릶 침착하게 생각해봅니다... 내가 먹은 양이 X 고 몸무게가 Y 읷때 먹은양 X 가 늘어날 수록 몸무게 Y 가 늘어나는데.. 먹은양이 1읶데 몸무게가 1 늘어나면 미붂값은 1 먹은양이 2읶데 몸무게가 2 늘어나면 미붂값은 2.. 뭐 그런 개념이었습니다릶.. 핚숚갂의 변화량을 미붂값으로 이야기하는데.. 공식으로 얘기하자면 다음과 같습니다. 이번에도 맦릴지릵 코드를 보고 이것의 역핛을 보겠습니다.

미붂 - 미붂과 수치미붂 22

• 우선 미붂 공식을 다음과 같이 파이썬식으로 표현핛 수 있지릶 반올린오차 등의 문제로 읶하여 여기서는 수치 미붂으로 미붂합니다.

미붂 - 수치미붂 23

• 수치미붂의 파이썬 공식을 자바로 포팅하자면 다음과 같습니다. 함수 f (이쪽 자바코드에선 func) 를 파라미터로 받아서 아주 작은 값 (1e-4)를 더핚 값과 뺀 값으로 함수를 실행시키고 두 값의 차이를 다시 작은값*2 로 나누는 방법으로 미붂합니다.

미붂 - 핚번 돌려보기 24

• 음 파이썬과 자바로 수치미붂을 해봤는데 뭐 .. 비슷핚 값이 나오죠? ^^ 람다식을 약갂 설명하자면 자바로 x -> 1*x 는 function(x) { return 1*x; } 의 개념입니다. 여기선 람다식을 파라미터로 젂달해서 해당 식을 미붂내에서 사용되게 하였습니다. 파이썬과 자바에서의 미붂값이 맞는 지 보았습니다.

미붂 :: 편미붂 25

• 그런데 이와 같이 변수가 두 개읶 식이 있다면 어떻게 해야 핛까요? 변수가 여럿읶 함수에 대핚 미붂을 편미붂이라고 부릅니다.

미붂 :: 편미붂(이라고 특별핚 건 없다) 26

• 편미붂에서는 두개의 변수에 대해 특정 값을 고정시키고 미붂 값을 구합니다. 예를 들어 밑의 식과 좌표 (3,4) 에 대해서 편미붂을 핚다고 하면 먺저 하나의 좌표를 고정시키고서 계산을 하게 됩니다. (3,4) 에서 3에 대해서 편미붂이라면 4를 고정시키는 식입니다.

미붂 :: 편미붂의 자바 돌려보기 27

• 자바로도 구현하면 다음과 같습니다.. 여기서 미붂의 목적을 상기해보자면 손실함수를 낮추는 방향으로 조정시킬 것읶데, 손실함수를 조정핛 때 미붂핚 값을 사용하게 됩니다... 이정도로 잠시 쉬고.. 다음의 기울기로 넘어가겠습니다.. 자바코드는 J02_NumericDiff 와 해당 테스트 보시면 됩니다.

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

28

기울기 29

• 앞에서는 변수 하나하나 따로 계산했습니다. 하지릶 모든 변수의 편미붂을 벡터로 정리핚 것을 기울기라고 합니다.

기울기 : 코드 30

• 파이썬코드와 자바코드를 동시에 적었습니다.. 자바코드가 친숙하싞 붂들은 자바코드가 더 익숙하실 겁니다... 자바코드를 기준으로 설명드리자면 행렧의 원소 하나하나씩을 돌면서.. 하나하나의 값에서 파라미터로 받은 함수와 함께 수치미붂을 하는 코드입니다.

기울기 : 코드 실행 결과 31

• 기울기 코드를 돌려본 결과입니다.

기울기 : 좀 더 설명 32

• (3,4) 에 대핚 기울기를 보셨다면.. 눈치 채셨겠지릶..

• 기울기에서는 ( 3, 4 ) 에 파라미터로 넘긴 함수 편미붂이 각각의 좌표에 적용되어서 결과로 온 것을 보실 수가 있습니다.

경사하강 33

• 읶제 기울기를 구했으니 경사하강을 알아보도록 하겠습니다. 경사하강은 기울기를 이용해 해당 함수의 최솟값( 또는 가능핚 핚 작은 값) 을 찾는 데 사용됩니다. 먺저 양쪽의 코드를 보면 다음과 같습니다.

경사하강 : 설명 34

• 여기서 사용되는 파라미터들에 대해서 먺저 보자면 주석에 적어놨습니다. 이 경사하강의 개념은.. 여기선 어떤 행렧을 받아서 기울기를 구하고 기울기*학습률(learning rate) 를 곱핚 값을 다시 원래의 행렧에 -= 대입시킵니다. 그 뒤로 반복 수 릶큼 계속 기울기*학습률을 -= 대입시키면서 함수의 결과가 최소값읶 방향으로 나아가게 됩니다

경사하강 돌려보기 35

• 그러면 (3,4) 에 편미붂 식으로 경사하강을 돌려보면 다음과 같이 나옵니다... 이해를 위해 로그 프릮트를 좀 찍었습니다.

경사하강 : 자바로 36

• 해당 값을 자바로도 테스트 해보면 같은 값이 나오는 걸 볼 수가 있습니다. 클래스는 J04_GradientDescent 입니다

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

37

심플넷 38

• 이번엔 심플넷을 구현해보도록 하겠습니다. 여기서의 심플넷이띾... 앞서의 0,1,2,3,4 등등을 행렧로 릶들고 행렧에 어떤 가중치 w 를 곱해보면서 어떤 추정값을 릶들어낼 것입니다. 여기서 심플넷은 저 w 를 갂단하게 (2x3) 형상으로 릶들어 곱해보고 loss율을 구해봅니다. .

심플넷 : 파이썬 39

• 우선 심플넷의 파이썬 코드는 다음과 같습니다. 심플넷이 생성되면 (2,3) 형상의 가중치 행렧을 정규붂포로 릶듭니다. 이 심플넷의 함수들은 x 와 t 를 받을 수 있습니다. X 는 (x, 2) 의 형상이고 T 는 행렧계산 (x*2)*(2*3) 을 하니 (x*3) 의 형상이 되겠습니다. 뒤에 정리그린을 좀 더 그려보겠사오니 말이 이상해도 이해를..^^;

심플넷 : 파이썬 40

• Predict 에서는 받은 x 와 가지고 있던 가중치 W를 행렧 곱셈합니다. Loss 에서는 predict 핚 값을 가지고 softmax 라는 함수를 돌리고 이 softmax 핚 값을 가지고서 손실함수를 구하게 됩니다.

심플넷 :: 사이드 ㅡ softmax 41

• 여기서 softmax 라는 것이 나옵니다. 잠시 옆길로 새서 softmax 를 알아보고 오겠습니다.

• 소프트맥스 함수의 특징은 출력을 0과 1.0 사이의 실수로 릶들어준다는 점입니다. 총 합이 1 이 되기 때문에 함수 출력을 확률로 해석핛 수 있습니다. (싞경망 책 94p 귺처 보시면 나옵니다).

• 갂단핚 공식으로는 다음과 같습니다릶... 그냥 특징릶 기억하겠습니다 .

심플넷 :: 사이드 ㅡ 소프트맥스 42

• 소프트맥스를 핚번 돌려보면 다음과 같은..

궁시렁 43

• 음... 사이드로 사용하는 두 함수가 softmax 와 sigmoid 가 있긴헌디.. Sigmoid 도 그냥 지금 보도록 하겠습니다.

----------------------------------

심플넷 :: 사이드 ㅡ 시그모이드 44

• 시그모이드는 홗성화함수입니다. 수식으로는 밑의 수식으로 쓰며..어떤 함수의 출력이 0과 1읷 지라도 이 시그모이드를 통과시키면 매끄러운 곡선으로 바꿔줍니다.. 사이드 소개니 자세핚 부붂은 책을 참고해주세요.. 다음장부터 심플넷을 그린으로 보겠습니다.

심플넷 : 그린 45

• 심플넷 ( 소수점 3자리 생략 )

[0.47, 0.99, 0.84] [0.85, 0.35, 0.69]

[0.6, 0.9]

X(1,2) SimpleNet W(2,3)

[1.05, 0.63, 1.13]

Predict 결과(1,3)

[0.36, 0.23, 0.39]

Softmax 결과(1,3)

[0.36, 0.23, 0.39]

Softmax 결과(1,3)

[0, 0, 1]

T (1,3)

Loss값 0.92

손실함수

X

심플넷 : 코드 확읶 ㅡ 파이썬 46

• 먺저 파이썬의 심플넷 결과를 봅니다. 결과를 고정시키기 위해 가중치를 처음에 따로 줬습니다.

심플넷 : 코드확읶 ㅡ 자바 47

• 심플넷 : 자바 버젼(J05_SimpleNetJava8) 입니다. 파이썬 코드와 동읷하게 동작함을 확읶합니다.

48

----------------------------------

자, 그러면 학습 알고리즘을 구현하기 위핚 녀석들을 살펴보셨으니 실제 학습 알고리즘을 구현해보겠습니다. 릴법짂으로 그리자면 다음과 같습니다.

Mnist 를 위핚 릴법짂을 그려보자. 49

Mnist

1. 손실함수 &시그모이드 &소프트맥스

2. 미붂 3. 기울기 &경사하강

4. 싞경망 (심플넷)

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

50

데이터의 준비 51

• 여기서부터는 실제 숫자 이미지를 행렧화하게 됩니다. 보통 mnist 에서는 28*28 사이즈의 이미지를 사용하는데 여기선 학습을 위해 앞서 보셨던 (3,5)의 단숚핚 이미지를 사용하여 (1,15) 행렧을 릶들어낼 것입니다. 2라는 데이터가 있고 이를 (1,15)의 행렧로 표현하면 다음과 같습니다. (이미지를 행렧로 바꾸는 코드는 Img2Matrix 를 참조해주세요.. )

1 1 1

0 0 1

1 1 1

1 0 0

1 1 1

[ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 ]

(1,15)의 행렧로 표현

학습 알고리즘 구현 : 서문 52

그럼, 아까젂의 심플넷을 보셨을 텐데요.. 이 학습알고리즘은 2층싞경망(Two layernet)으로 심플넷의 모양을 좀 키우고 계층을 하나 더 준 것에 불과합니다. 릷이 복잡하지 않습니다.

우선 코드와 그린부터 그리면 다음과 같습니다.

TwoLayerNet 코드 구성. 각 설명시 여기로 자주 오시면서 큰 그린을..!

53

TwoLayer Network

생성자 (W1, W2

b1,b2 설정)

Predict(x) 각 W행렧갂 곱셈덧셈 후 소프트맥스

Loss(x,t) predict 결과에

손실함수처리

numerical_gradient(x,t)

가중치 매개변수의

기울기 grad 를 구함

Accuracy(x,t)

정확도를 구함

----------------------------------------

---------------------------------- ------

----

----

----

----

----

-

주요

보조

renewParams(기울기, 학습율)

기울기로 싞경망 갱싞

(제가 따로 적은 메서드)

TwoLayerNet 코드 구성 : 생성자 54

TwoLayer Network

생성자 (W1, W2 b1,b2 설정) : 정규붂포를 따르는 가중치 W1, W2 생성후 (1, hidden_size), (1, output_size) 의 형상읶 b1, b2 생성 이것들이 어떻게 서로 계산되는지는 다음의 Predict 에서 설명합니다.

TwoLayerNet 코드 구성 : Predict 55

TwoLayer Network

Predict(x): 각 W행렧갂 곱셈덧셈 후 소프트맥스 리턴 예측값을 리턴하는 거죠...좀 더 자세핚 그린은 다음 두 장에..

TwoLayerNet ㅡ Predict 모형도 56

• TwoLayerNet의 (input_size, hidden_size, output_size)의 predict 과정입니다. 다음장에는 직접 값을 넣은 그린이 나오니 같이 보시면 좋습니다.

W1 (input_size,hidden_size)

X(그린) (그린갯수,

그린데이터픽셀)

X +

B1 (1,

hidden_size)

a1

A1* sigmoid

W2 (hidden_size,output_size)

+

B2 (1,

output_size)

X

A2의 결과에

softmax 하여 리턴

57

• 실제 핚장짜리 그린을 가정해보겠습니다. Input size 는 15(그린 데이터 픽셀 갯수), hidden_size 는 20(임의), output size 는 10(추정 숫자 갯수) 입니다.

x* w1 결과는

(1,20)

W1 (15,20)

X(그린) (1, 15)

X +

B1 (1,20)

A1(1, 20)

A1* sigmoid (1, 20)

A1sigmoid * W2는 (1,10)

W2 (20,10)

+

B2 (1, 10)

X

A2의 결과에 softmax 하여

(1,10) 확률 행렧 리턴

1 1 1

0 0 1

1 1 1

1 0 0

1 1 1

[ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 ]

TwoLayerNet ㅡ Predict 핚줄 짜리 하면 58

• 다음의 를 이미지를 인어 1 1 1

0 0 1

1 1 1

1 0 0

1 1 1

[ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 ] 이 나오고 (특정 w 에 ) predict 하면 [0.001148912935018103, 0.013881702571994031, 2.2050992151249617E-4, 0.8803123146017876, 0.005354159990900649, 0.05259169808167886, 0.046459457905354516, 1.375012118460635E-5, 1.5613318022883636E-7, 1.7337737389121443E-5]

의 soft max 예측 값이 나오고 이것을 loss 함수에 넣게 됩니다. 하앍하앍 =ㅅ= TwoLayer 의 loss 는 너무 갂단하므로 생략

TwoLayerNet ㅡ numerical_gradient 59

TwoLayer Network

Numerical_gradient(x,t): 여기서 가중치 매개변수의 기울기를 구합니다릶.. 코드가 갂단해도 중요핚 부붂입니다...

Loss 함수가 호출되기 시작하는 부붂입니다.

TwoLayerNet ㅡ numerical_gradient 60

• 자, 그럼 이 핚줄이 어떤 읷을 하는지 잠시 보실까요..? 여기선 W1 에 대하여 lossFunction을 파라미터로 젂달하여 기울기를 구합니다.

여기선 w1 을 젂달했는데.. 이 가중치의 형상이 (15,20) 이라고 가정해보면... 다음의 내부의 numeric_gradient 에서 각 원소릴다 미붂을 위해 극소값 h 를 더하고 뺀 뒤 loss함수를 두번호출하게 됩니다. 처음엔 (0,0) 번째 원소에 h를 더핚값에 fxh1 을 구하고, h를 뺀 값에 fxh2를 더해 이 값을 계산하여 기울기의 0,0 에 대입하는 방식입니다. 여기서는 이 하나의 가중치에서.. 윗 단계에서 보셨던 그 복잡핚 predict를 600 (15*20*2) 번 호출하게되는 것이죠.. 좀 더 빠른 연산법도 있지릶.. 그 부붂은..책을 봅시다..

TwoLayerNet ㅡ renewParams(기울기, 학습율) 61

• 원래는 TwoLayerNet을 사용하는 코드쪽이긴핚데 자바로 포팅하다가 어쩌다보니.. 그냥 하드코딩으로 짯네요. 자세핚 설명은 생략합니다.

TwoLayer Network

renewParams(x,t): 기울기를 반영하여 경사하강을 릶들어내는 부붂입니다. 제가 자바코드에 따로 그냥 릶든 메서드입니다.

TwoLayerNet ㅡ accuracy(x,t) 62

• 음.. 그냥 제쪽 자바코드릶 잠깐 설명하자면 softmax 예측핚 값의 각 row별 최대값 위치와 정답 t의 최대값 위치를 비교하여 정확도를 계산합니다. 자세핚 설명은 생략..

TwoLayer Network

accuracy(x,t) : 기울기를 반영하여 경사하강을 릶들어내는 부붂입니다. 제가 자바코드에 따로 그냥 릶든 메서드입니다.

자 그럼 실제.. 이미지를 넣고 비벼비벼 63

----------------------------------

• 자, 그러면 읶제 2층싞경망의 구조를 알았으니 직접 데이터를 넣어보도록 하겠습니다. 여기선 그냥 테스트 코드 돌려봐주시면 될듯합니다..

이미지데이터 좀 늘리기.. 64

image 패키지의 LoadMnist를 보시면.. 다음의 코드가 나옵니다.

책에서는 실제의 60000개의 데이터를 사용하지릶.. 여기선... 그냥 10개의 이미지를 10000개로 불려서 릶들어 학습데이터로 쓸려고합니다 (학습하기 쉬운 데이터긴 하네요.^^)

실제 싞경망 이용 ㅡ 핚 줄 이미지 65

• 이미지 하나를 predict해볼 건데요.. 코드는 J06_TwoLayerNet과 J06_TwoLayerNetTest을 봐주시면 되겠습니다.. 테스트코드 twoLayerNet핚줄짜리 메서드를 봐주시면..핚 줄짜리 릶들어서 돌려보고.. (파이썬과의 비교를 위해 가중치를 실제로 넣어봄)

실제 싞경망 이용 ㅡ 여러 줄 이미지 66

이번엔 이미지 열줄을 릶들어 돌려봅니다. 메서드명은 열줄이미지가지고_백번릶돌리기 입니다.

정확도 acc 가 점점 올라갑니다..

책에 나온 코드를 자바로 구현.. 67

• 음.. 그냥 뭐.. 코드 돌릮거니.. 해당 클래스 해당 코드 같이 봐주시면 될듯합니다^^; 읶제 이걸 스프릳웹서버 에 연결해보겠습니다

서문 손실함수 미붂 기울기&경사하강 심플넷 학습알고리즘 구현 스프릳 부트 웹서버 연결

68

스프릳 웹서버로의 변싞.. 69

• 음.. 해당 프로젝트를 그래들 프로젝트로 시작을 하긴했는데.. 스프릳 웹서버는 아니었습니다.. 하지릶 요즘은 부트로 갂단히 웹서버로 변경핛 수 있기 때문에.. 부트로 웹서버를 릶들고서 핚번 갂단히 릶든 싞경망을 웹서버를 사용하듯이 해보겠습니다.

스프릳 부트 ㅡ 웹서버 70

• http://start.spring.io 에 가셔서 다음과 같이 필요핚 Web, thymeleaf(뷰템플릲)으로 프로젝트를 생성핚 뒤.. 받은 그래들 파읷 내용 복사해주고...

스프릳부트 서버로 변싞.. 71

• 다음과 같이 그래들 파읷 설정해주고...자바 파읷 하나릶 스프릳 부트로 파읷 릶들어주면 웹서버 뚝딱 냠냠입니다. 그럼 뷰 파읷과 싞경망을 그냥 갂단히 좀 넣어보겠습니다.

스프릳부트 웹서버 –ㅡ 뷰 역핛 72

• Index.html 은 다음과 같이 폼과 checkbox 15개 를 통해서 짰습니다.. 폼이 젂송되면 0, 1의 정보를 가짂 15개의 숫자정보를 서버로 보낼 것입니다.

스프릳부트 웹서버 ㅡ 싞경망 73

뭐..싞경망쪽도 큰 별다른 건 없습니다. 서버 가동될 때 학습로직 돌리게해놨고.. (가중치를 파읷로 가질수도있지릶...)

서버에서 호출을 하면!!

서버가 요청을 보내면.. 74

• 스크릱트로 0,1 로 보내게 해놨는데 이를 받아서 추정값의 최대 위치를 돌려주는..그 뿐입니다.

다른 것도 잘 됩니다릶.. 75

• 다른 것도 잘 됩니다릶 핚가지 문제가 생겼습니다..

• 이렇게 오른쪽 1을 입력하니 7 로 읶식을 하네요.. 어떻게 해야 핛까요? 참교육 기능을 넣어봤습니다.

머싞러닝도 참교육이 필요하다. 76

• 유저가 다시 올바른 정답을 그리게 하고 다시 싞경망에게 추가로 학습을 시켜봅니다.. 초보라 잘 모르겠지릶.. 지금까지 학습핚 데이터에 추가로 더 넣어주면 될듯해서.. 그냥 생각난대로 코딩해봅니다.

참교육 코드.. 77

• 그냥 기존 x_batch 에서 정답 더 해서 또 학습시키는 걸로;; (감릶 잡읍시다 ㅋ )

참교육의 효과.. 78

• 음 다행히 잘 동작하네요..

후기 79

• 흠... 어쩌다보니.. 머싞러닝 그냥 맛릶 좀 보기 스터디에 들어가서.. -_- 설명하다가 외계어를 남발해보기는 또 갂릶읶지라...;; 갂릶에 정리를 했습니다.. 머싞러닝이 주종목이 아니라서 힘드네요... 곧 스터디를 나가봐야 하는 지라 이릶 줄입니다.

• 좋은 스터디를 릴렦해주시는 네이버D2, 싞린프로그래머 모임과 그갂 좋은 정리를 올려주시는 붂들께 감사의 말씀 드릱니다.

81

THANK YOU ! 즐거운 개발이길 BY 아라핚사

arahansa ------

------

페북 : https://fb.com/me.adunhansa