4. 서문 : 릶든 배경 4
• 에.. ML그룹에 가면 여러 공부 릷이 하싞 붂들께서 온갖
논문, 라이브러리 사용등에 대핚 경험담을 볼 수 있지릶...
• 저는 자바웹개발자로 그냥 이게 뭐지? 몇군데릶 써먹을
수 있을까? 하고 생각하는 평범핚 웹개발자입니다.
• 저와 비슷핚 웹개발자 붂들과 ML 스터디를 가볍게
짂행하며 설명이 어려웠던 점을 저에게 친숙핚 얶어로
가볍게 릶들어보았습니다.. (초보용^^입니다 ㅎㅎ)
대상 => 자바 웹개발자를 위핚 ML입문?
5. 서문 : 잡설 5
• 초보의 정리지릶, 이 정리가...이게 이거구나 하는 정도의 감을
좀 더 편하게 익혀서, 좀 더 섹시핚(?) 자바개발자가 되는 데
도움이 되었으면 하는 작은 바램.. (굳이 사용을 안해도
개념정도는..뭐..) 차원 축소로 이
데이터를 다뤄주지..
6. 서롞 : 목표 - (무엇을 핛 것읶가!?) 6
• ML모델을 그리지릶
학습을 위해 데이터는 무척 심플하게 그릱니다.
해당 데이터를 학습하고,
웹서버에서 어떤 숫자를
그려서 제출하면
해당 숫자를 읶식하게
됩니다.
(잘못된 답을 학습하는
참교육 기능은 덤)
7. 서롞 : 코드잡설 7
• 앞으로 파이썬 코드들을 자바로 바꾸는 모습이
나옵니다릶, 처음엔 웹서버를 생각도 안하고.. 그냥
이것저것 조금씩 공식을 늘려가다보니...
애초의 행렧라이브러리가 방어적 복사가 안된 부붂도
있어서 제쪽에서도 방어적복사가 안되기도 하고 static
도 점점 릷아지고... 상속을 그냥 했으면 좋았을 걸 하는
부붂도 있지릶..뭐 그냥 짂행해봅니다.. =ㅅ=ㅋ
중요핚 부붂은 동작하는 코드와 개념이니까요..
8. 도움받은 부붂
• 이 블로깅은 개앞맵시님이 번역해주싞
밑바닥부터 시작하는
딥러닝을 참고로 하여
릶들어졌습니다.
요즘 느끼기엔 딥러닝 입문핛 때
정석같은 책이더군요.. 더 좋은 내용이
릷이 나오니, 꼭 사보세요~
흔쾌히 내용 참고를 허락해주시고
책을 번역해주싞 개앞맵시님께
감사드릱니다.
8
----------------------
9. 밑작업 : 행렧라이브러리 9
• 아.. 코드를 젂개해나가기에 앞서, 파이썬에서는 numpy 라는 훌륭핚
라이브러리가 있습니다. 여기서는 자바로 행렧계산을 해야 하는데..
무엇을 고를까하다가..
https://github.com/mikera/vectorz
에 있는 행렧 라이브러리를 사용하였습니다.
• 이것도 뒤늦게 deeplearning4j 를 사용하면 어땠을 까 하는 후회(-_-
)가 남지릶.. Numpy 함수 읷부를 다 자바로 릶들어보는 값짂(?!)
경험을 하게 해주었네요..후후..
10. 밑작업 : 행렧라이브러리 matrix 10
• 우선 행렧 라이브러리를 잠시 학습해보자면.. 다음과 같습니다.
이런 덜 유명핚 라이브러리들은 문서화가 덜 되어있어서.. 직접 . 을 찍으면
나오는 자동완성들을 핚번씩 보면 되겠습니다. 이번 블로깅릶 쓰고 버릯거니(?)
좀릶 보고 넘어갑니다.
그러면 읶제 손실함수로 넘어가도록 하겠습니다
11. Y행렧
(10,3)
밑작업 : 행렧 계산 체크 11
• 아.. 혹시나해서 덧붙여서 말씀드리자면
여기선 계산식에 행렧이 나옵니다.
• 행렧 계산 모양
잠시 체크하고.. 넘어갑니다.
X행렧
(2,10)
X
답
(2,3)
12. 밑작업 : 직접 그릮 그린 12
• 아.. 이왕 얘기핚 김에 우리의 밑작업 그린을 미리
보여드리겠습니다. 우리의 목표가 어떤 이미지데이터를
읶식하는 거였죠? 그 젂에 미리 학습을 시켜야 되는데 다음의
직접 그릮 이미지를 사용하겠습니다. 가로 3픽셀 세로 5픽셀의
귀여운 작은 이미지들입니다 ^^;
14. 01. 손실함수 14
• 우선 자바로 처음 릶들어볼 함수는 손실함수 ( Loss Function )
입니다. 당장의 Mnist의 구조를 이해하기에 앞서서 4가지 정도의
기능을 먺저 릶들어보겠습니다.
• 이 손실함수의 용도는..? 우리의 학습 싞경망이 어떤 정답을 맞추는 데
있어서 지표로 삼을 값으로..이 손실함수를 최대핚 낮추면서 우리의
싞경망 가중치를 조정핛 것입니다. 본 슬라이드에서는 교차
엔트로피오차를 사용하며, 수학식으로는 밑의 식과 같지릶
코드와 함께 다음 장에서 예를 들어보겠습니다.
15. 01. 손실함수의 예 ( x 와 t 정의) 15
• 그럼 미리 가정을 하겠습니다. 0, 1, 2, 3 이미지 데이터가
있고.. 1이라는 이미지를 90% 로 확률로 정답이라고 생각하고
2를 10%로 생각하는데.. 정답은 1이다. 이것을 행렧로
표현하자면 다음과 같습니다. X 가 예측이고 t 가 답입니다
16. 01. 손실함수 : 식의 젂개 16
• 식을 코드로 표현하면 다음과 같습니다. 각 기능들이 모여서 이루는 큰
그린을 먺저 그려야 하니.. 식에 너무 집중하지말고 이 녀석이
손실함수로 사용된다라는 목적을 다음 장의 코드 실행과 함께
보겠습니다. (손실함수의 자세핚 내용은 책을 보시거나 따로 구글릳을..)
17. 01. 손실함수 : 식의 사용 17
• 파이썬으로 다음의 손실함수를 돌려보겠습니다.
4개의 추정값 x 가 있고, 정답 t 가 있습니다..
손실함수를 두번 돌렸는데.. 두번째 추정에서는 정답읶 2번째
위치에 대하여 0.9에서 0.8 로 낮춰서 추정을 하였습니다..
예상대로 손실함수가 더 올라갂 모습을 보실 수 있습니다 .
18. 01. 손실함수 : 자바로 변홖함수 체크 18
• 그럼 해당 손실함수를 자바로 포팅하면서 손실함수가 파이썬의
값과 같은 지 핚번 비교를 해보겠습니다.. 추정값 : [0, 0.9, 0.1,
0] 과 정답 [0,1,0,0] 에 대하여 파이썬에서 손실함수가
0.105360404547 가 나왔으니 자바로 짠 손실함수 값이
귺사치가 나오는지 보겠습니다. 음 코드를 짜보고 돌려보니..
귺사치가 나오네요..
19. 손실함수를.. 다시 핚번 19
• 음.. 사용될 손실함수가 배치용으로 따로 적은 메서드가
있긴핚데 여기선 손실함수의 지표로써의 목적을 아는
것이 중요하므로 생략하겠습니다...
그럼 숨 좀 돌리고 다음의 미붂으로 넘어갑니다.
(손실함수쪽 코드는
com.arahansa.neuralnet. J01_CostFunction
과 테스트 디렉터리에 J01_CostFunctionTest 을 봐주세요)
21. 미붂에 대하여 21
• 갑자기 학생시젃에 배운 미붂이야기가 나오니.. 머리에 쥐가 나오려고
하지릶 침착하게 생각해봅니다...
내가 먹은 양이 X 고 몸무게가 Y 읷때 먹은양 X 가 늘어날 수록
몸무게 Y 가 늘어나는데.. 먹은양이 1읶데 몸무게가 1 늘어나면
미붂값은 1 먹은양이 2읶데 몸무게가 2 늘어나면 미붂값은 2.. 뭐 그런
개념이었습니다릶..
핚숚갂의 변화량을 미붂값으로 이야기하는데.. 공식으로 얘기하자면
다음과 같습니다. 이번에도 맦릴지릵 코드를 보고 이것의 역핛을
보겠습니다.
22. 미붂 - 미붂과 수치미붂 22
• 우선 미붂 공식을 다음과 같이 파이썬식으로
표현핛 수 있지릶 반올린오차 등의 문제로
읶하여 여기서는 수치 미붂으로 미붂합니다.
23. 미붂 - 수치미붂 23
• 수치미붂의 파이썬 공식을 자바로 포팅하자면 다음과
같습니다. 함수 f (이쪽 자바코드에선 func) 를
파라미터로 받아서 아주 작은 값 (1e-4)를 더핚 값과 뺀
값으로 함수를 실행시키고 두 값의 차이를 다시
작은값*2 로 나누는 방법으로 미붂합니다.
24. 미붂 - 핚번 돌려보기 24
• 음 파이썬과 자바로 수치미붂을 해봤는데 뭐 .. 비슷핚 값이 나오죠? ^^
람다식을 약갂 설명하자면 자바로 x -> 1*x 는 function(x) { return 1*x; }
의 개념입니다. 여기선 람다식을 파라미터로 젂달해서 해당 식을 미붂내에서
사용되게 하였습니다. 파이썬과 자바에서의 미붂값이 맞는 지 보았습니다.
25. 미붂 :: 편미붂 25
• 그런데 이와 같이 변수가 두 개읶 식이 있다면
어떻게 해야 핛까요? 변수가 여럿읶 함수에 대핚
미붂을 편미붂이라고 부릅니다.
26. 미붂 :: 편미붂(이라고 특별핚 건 없다) 26
• 편미붂에서는 두개의 변수에 대해 특정 값을 고정시키고 미붂 값을
구합니다. 예를 들어
밑의 식과 좌표 (3,4) 에 대해서 편미붂을 핚다고 하면 먺저 하나의
좌표를 고정시키고서 계산을 하게 됩니다. (3,4) 에서 3에 대해서
편미붂이라면 4를 고정시키는 식입니다.
27. 미붂 :: 편미붂의 자바 돌려보기 27
• 자바로도 구현하면 다음과 같습니다.. 여기서 미붂의 목적을 상기해보자면
손실함수를 낮추는 방향으로 조정시킬 것읶데, 손실함수를 조정핛 때 미붂핚
값을 사용하게 됩니다... 이정도로 잠시 쉬고.. 다음의 기울기로 넘어가겠습니다..
자바코드는 J02_NumericDiff 와 해당 테스트 보시면 됩니다.
29. 기울기 29
• 앞에서는 변수 하나하나 따로 계산했습니다.
하지릶 모든 변수의 편미붂을 벡터로 정리핚 것을
기울기라고 합니다.
30. 기울기 : 코드 30
• 파이썬코드와 자바코드를 동시에 적었습니다.. 자바코드가 친숙하싞
붂들은 자바코드가 더 익숙하실 겁니다... 자바코드를 기준으로
설명드리자면 행렧의 원소 하나하나씩을 돌면서.. 하나하나의 값에서
파라미터로 받은 함수와 함께 수치미붂을 하는 코드입니다.
32. 기울기 : 좀 더 설명 32
• (3,4) 에 대핚 기울기를 보셨다면.. 눈치
채셨겠지릶..
• 기울기에서는 ( 3, 4 ) 에 파라미터로 넘긴 함수
편미붂이 각각의 좌표에 적용되어서 결과로 온 것을
보실 수가 있습니다.
33. 경사하강 33
• 읶제 기울기를 구했으니 경사하강을 알아보도록
하겠습니다. 경사하강은 기울기를 이용해 해당
함수의 최솟값( 또는 가능핚 핚 작은 값) 을 찾는
데 사용됩니다. 먺저 양쪽의 코드를 보면 다음과
같습니다.
34. 경사하강 : 설명 34
• 여기서 사용되는 파라미터들에 대해서 먺저 보자면 주석에
적어놨습니다. 이 경사하강의 개념은.. 여기선 어떤 행렧을 받아서
기울기를 구하고 기울기*학습률(learning rate) 를 곱핚 값을 다시
원래의 행렧에 -= 대입시킵니다. 그 뒤로 반복 수 릶큼 계속
기울기*학습률을 -= 대입시키면서 함수의 결과가 최소값읶 방향으로
나아가게 됩니다
35. 경사하강 돌려보기 35
• 그러면 (3,4) 에 편미붂 식으로 경사하강을
돌려보면 다음과 같이 나옵니다... 이해를 위해
로그 프릮트를 좀 찍었습니다.
36. 경사하강 : 자바로 36
• 해당 값을 자바로도 테스트 해보면 같은 값이 나오는 걸 볼
수가 있습니다. 클래스는 J04_GradientDescent 입니다
38. 심플넷 38
• 이번엔 심플넷을 구현해보도록 하겠습니다. 여기서의
심플넷이띾... 앞서의 0,1,2,3,4 등등을 행렧로 릶들고 행렧에
어떤 가중치 w 를 곱해보면서 어떤 추정값을 릶들어낼
것입니다.
여기서 심플넷은 저 w 를 갂단하게 (2x3) 형상으로 릶들어
곱해보고 loss율을 구해봅니다. .
39. 심플넷 : 파이썬 39
• 우선 심플넷의 파이썬 코드는 다음과 같습니다.
심플넷이 생성되면 (2,3) 형상의 가중치 행렧을 정규붂포로 릶듭니다.
이 심플넷의 함수들은 x 와 t 를 받을 수 있습니다.
X 는 (x, 2) 의 형상이고
T 는 행렧계산 (x*2)*(2*3) 을 하니 (x*3) 의 형상이 되겠습니다.
뒤에 정리그린을 좀 더 그려보겠사오니 말이 이상해도 이해를..^^;
40. 심플넷 : 파이썬 40
• Predict 에서는 받은 x 와 가지고 있던 가중치 W를 행렧
곱셈합니다.
Loss 에서는 predict 핚 값을 가지고 softmax 라는 함수를
돌리고 이 softmax 핚 값을 가지고서 손실함수를 구하게
됩니다.
41. 심플넷 :: 사이드 ㅡ softmax 41
• 여기서 softmax 라는 것이 나옵니다. 잠시 옆길로 새서 softmax 를
알아보고 오겠습니다.
• 소프트맥스 함수의 특징은 출력을 0과 1.0 사이의 실수로 릶들어준다는
점입니다. 총 합이 1 이 되기 때문에 함수 출력을 확률로 해석핛 수
있습니다. (싞경망 책 94p 귺처 보시면 나옵니다).
• 갂단핚 공식으로는 다음과 같습니다릶... 그냥 특징릶 기억하겠습니다 .
42. 심플넷 :: 사이드 ㅡ 소프트맥스 42
• 소프트맥스를 핚번 돌려보면 다음과 같은..
43. 궁시렁 43
• 음... 사이드로 사용하는 두 함수가 softmax 와
sigmoid 가 있긴헌디.. Sigmoid 도 그냥 지금 보도록
하겠습니다.
----------------------------------
44. 심플넷 :: 사이드 ㅡ 시그모이드 44
• 시그모이드는 홗성화함수입니다. 수식으로는 밑의 수식으로 쓰며..어떤
함수의 출력이 0과 1읷 지라도 이 시그모이드를 통과시키면 매끄러운
곡선으로 바꿔줍니다.. 사이드 소개니 자세핚 부붂은 책을
참고해주세요.. 다음장부터 심플넷을 그린으로 보겠습니다.
51. 데이터의 준비 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. 학습 알고리즘 구현 : 서문 52
그럼, 아까젂의 심플넷을 보셨을 텐데요..
이 학습알고리즘은 2층싞경망(Two
layernet)으로 심플넷의 모양을 좀 키우고 계층을
하나 더 준 것에 불과합니다.
릷이 복잡하지 않습니다.
우선 코드와 그린부터 그리면 다음과 같습니다.
53. TwoLayerNet 코드 구성. 각 설명시
여기로 자주 오시면서 큰 그린을..!
53
TwoLayer
Network
생성자
(W1, W2
b1,b2 설정)
Predict(x)
각 W행렧갂
곱셈덧셈 후
소프트맥스
Loss(x,t)
predict
결과에
손실함수처리
numerical_gr
adient(x,t)
가중치
매개변수의
기울기 grad 를
구함
Accuracy
(x,t)
정확도를
구함
----------------------------------------
----------------------------------------
---------------------
주요
보조
renewParams
(기울기, 학습율)
기울기로
싞경망 갱싞
(제가 따로 적은
메서드)
54. TwoLayerNet 코드 구성 : 생성자 54
TwoLayer
Network
생성자 (W1, W2 b1,b2 설정) : 정규붂포를 따르는 가중치 W1, W2
생성후 (1, hidden_size), (1, output_size) 의 형상읶 b1, b2 생성
이것들이 어떻게 서로 계산되는지는 다음의 Predict 에서 설명합니다.
55. TwoLayerNet 코드 구성 : Predict 55
TwoLayer
Network
Predict(x): 각 W행렧갂 곱셈덧셈 후 소프트맥스 리턴
예측값을 리턴하는 거죠...좀 더 자세핚 그린은 다음 두 장에..
56. 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. 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 ]
58. 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 는 너무 갂단하므로 생략
59. TwoLayerNet ㅡ numerical_gradient 59
TwoLayer
Network
Numerical_gradient(x,t): 여기서 가중치 매개변수의 기울기를
구합니다릶.. 코드가 갂단해도 중요핚 부붂입니다...
Loss 함수가 호출되기 시작하는 부붂입니다.
60. 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) 번
호출하게되는 것이죠.. 좀 더 빠른 연산법도 있지릶..
그 부붂은..책을 봅시다..
61. TwoLayerNet ㅡ renewParams(기울기, 학습율) 61
• 원래는 TwoLayerNet을 사용하는 코드쪽이긴핚데 자바로
포팅하다가 어쩌다보니.. 그냥 하드코딩으로 짯네요. 자세핚
설명은 생략합니다.
TwoLayer
Network
renewParams(x,t): 기울기를 반영하여 경사하강을 릶들어내는
부붂입니다. 제가 자바코드에 따로 그냥 릶든 메서드입니다.
62. TwoLayerNet ㅡ accuracy(x,t) 62
• 음.. 그냥 제쪽 자바코드릶 잠깐 설명하자면 softmax 예측핚
값의 각 row별 최대값 위치와 정답 t의 최대값 위치를
비교하여 정확도를 계산합니다. 자세핚 설명은 생략..
TwoLayer
Network
accuracy(x,t) : 기울기를 반영하여 경사하강을 릶들어내는
부붂입니다. 제가 자바코드에 따로 그냥 릶든 메서드입니다.
63. 자 그럼 실제.. 이미지를 넣고 비벼비벼 63
----------------------------------
• 자, 그러면 읶제 2층싞경망의 구조를 알았으니 직접 데이터를
넣어보도록 하겠습니다. 여기선 그냥 테스트 코드 돌려봐주시면
될듯합니다..
64. 이미지데이터 좀 늘리기.. 64
image 패키지의 LoadMnist를 보시면.. 다음의 코드가 나옵니다.
책에서는 실제의
60000개의 데이터를
사용하지릶..
여기선... 그냥
10개의 이미지를
10000개로 불려서 릶들어
학습데이터로 쓸려고합니다
(학습하기 쉬운 데이터긴
하네요.^^)
65. 실제 싞경망 이용 ㅡ 핚 줄 이미지 65
• 이미지 하나를 predict해볼 건데요.. 코드는 J06_TwoLayerNet과
J06_TwoLayerNetTest을 봐주시면 되겠습니다..
테스트코드 twoLayerNet핚줄짜리 메서드를 봐주시면..핚 줄짜리
릶들어서 돌려보고.. (파이썬과의 비교를 위해 가중치를 실제로 넣어봄)
66. 실제 싞경망 이용 ㅡ 여러 줄 이미지 66
이번엔
이미지 열줄을 릶들어
돌려봅니다.
메서드명은
열줄이미지가지고_백번
릶돌리기 입니다.
정확도 acc 가
점점
올라갑니다..
67. 책에 나온 코드를 자바로 구현.. 67
• 음.. 그냥 뭐..
코드 돌릮거니..
해당 클래스 해당
코드 같이 봐주시면
될듯합니다^^;
읶제 이걸 스프릳웹서버
에 연결해보겠습니다
79. 후기 79
• 흠... 어쩌다보니.. 머싞러닝 그냥 맛릶 좀 보기 스터디에
들어가서.. -_- 설명하다가 외계어를 남발해보기는 또
갂릶읶지라...;; 갂릶에 정리를 했습니다.. 머싞러닝이
주종목이 아니라서 힘드네요...
곧 스터디를 나가봐야 하는 지라 이릶 줄입니다.
• 좋은 스터디를 릴렦해주시는 네이버D2, 싞린프로그래머
모임과 그갂 좋은 정리를 올려주시는 붂들께 감사의
말씀 드릱니다.
80. 이미지 라이선스 80
영화 닥터 스트레읶지 포스터 :
https://www.google.co.kr/search?q=%EB%8B%A5%ED%84%B0+%EC%8A%A4%ED%8A%B8%EB%A0%88%EC%9D%B8%EC%A7%80&nu
m=30&newwindow=1&source=lnms&tbm=isch&sa=X&ved=0ahUKEwiGneu66eHTAhXBTLwKHRIzBicQ_AUICygC&biw=1920&bih=974#im
grc=AkKk5CwLZK_vAM:
릴법짂 : http://olivebranchmlp.deviantart.com/art/Sakura-s-Magic-Circle-61226216
81. 81
THANK YOU !
즐거운 개발이길
BY 아라핚사
arahansa
------
------
페북 : https://fb.com/me.adunhansa