본문 바로가기

Python

역.전.파의 기본 개념 ㅇ 무슨 조폭 이름도 아니고 처음 들어보지만 개념은 이해할 수 있다. 여태 Input에서 Output으로 결과를 살펴보는 것을 하였다. 이 것을 순전파(Foward)라고 한다. 하지만 weight를 찾으려고 얼마나 고생했나? 몇 십개의 노드와 레이어를 달고 계속 기울기를 계산해 편향을 계산했다. 지금이야 간단한 것들을 하니까 괜찮지만 대용량의 데이터를 처리할 때에는 곤란하다. 그래서 나타난 개념이 역전파(Backward)이다. 순방향과는 반대로 반대 방향으로 국소적 미분을 곱하며 다음 노드로 전달한다. 무슨 소린지 잘 모르겠고 구현하면서 이해해보자. class MulLayer: def __init__(self): self.x = None self.y = None def forward(self, x, y)..
Tensorflow(keras)를 이용해 MNIST digits 분류해보기 0. 딥러닝을 시작하면서 가장 처음 접하게 되는 데이터 셋은 거의 MNIST 데이터베이스일 것이다. 어떤 사람들은 이 데이터베이스를 'Hello, Deep Learning!' 라고 한다. #include int main(void){ printf("Hello, World"); return 0; } 아마 이런거 아닐까...? 아무튼 아직 역전파는 제대로 (이해도) 못하고 있으니 순전파로 MNIST를 분류해보았다. MNIST는 이렇게 생긴 귀여운 데이터베이스셋이다. 훈련케이스 6만개, 테스트케이스 1만개를 가지고 있는 이 친구는 28*28로 표현되고 각 값은 0~255의 값을 가진다. 하나 뽑아서 배열로 보면 눈에 들어온다. [[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ..
List에 값을 append했을 때 List 전체 값이 변하는 현상 def gradient_descent(f, init_x, lr=0.01, step_num=100): x = init_x output = [] for i in range(step_num): print(x) output.append(x) print(output) grad = numerical_gradient(f, x) x -= lr * grad 신경망 공부 중 갱신 과정을 확인하기 위해 리스트에 값을 담으려고 했다. 하지만 제대로 담기지 않는 것을 확인할 수 있었다. print해보면 x는 제대로 움직이고 있는데 막상 리스트는 for문을 반복한 만큼 마지막 값을 가지고 있었다. 논리적으로 맞는거 같은데 왜 안될까 한참 고민했다. 이유는 같은 개체를 재사용하고 있기 때문이다. 객체지향에 익숙하지 않아서인데 x를..
퍼셉트론에서 신경망으로(7) 기계학습은 학습 단계에서 최적의 매개변수를 찾아내야 한다. 최적이란 손실 함수가 최솟값이 될 때의 매개변수 값인데 기울기를 이용해 함수의 최솟값을 찾으려는 것이 경사법이다.그런데 기울기가 가르키는 곳이 함수의 최솟값이 아닐수도 있다는 점을 명심해야한다. 복잡하게 생긴 함수(이를테면 3차 이상의)를 생각해보면 실제로 최솟값이 아닌데도 최솟값처럼 보이는 애들이 있다. 이것을 유의해야한다. 경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한다. 이동한 곳에서 기울기를 구하고, 그 기울어진 방향으로 나아가서 함수의 값을 점차 줄인다. 경사법을 파이썬으로 구현하면 이렇다. def gradient_descent(f, init_x, lr=0.01, step_num=100): x = init_x for i i..
퍼셉트론에서 신경망으로(6) 미분은 한순간의 변화량을 표시한 것이다. 표기법은 다음과 같다. $$\frac{df(x)}{dx}=\lim_{h→0}\frac{f(x+h)-f(x)}{h}$$ 함수를 미분하는 계산을 파이썬으로 구현해보자. def numerical_diff(f, x): h = 1e-4 return (f(x+h) - f(x-h)) / (2*h) 만든 미분식을 이용해 실제로 함수를 미분한 뒤 그래프로 그려본다. import numpy as np import matplotlib.pylab as plt def numerical_diff(f, x): h = 1e-4 return (f(x+h) - f(x-h)) / (2*h) def function_1(x): return 0.01*x**2 + 0.1*x x = np.arange(0...
퍼셉트론에서 신경망으로(5) - 학습 : 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득 - 지표 : 신경망이 학습할 수 있도록 해줌 (손실 함수) 신경망은 데이터를 보고 학습할 수 있다. 여기서 학습한다는 의미는 가중치 매개변수의 값을 데이터를 보고 자동으로 결정한다는 것이다. 데이터에서 답을 찾고 데이터에서 패턴을 발견하기 때문에 꼭 데이터가 있어야 한다. 신경망 학습에서 사용하는 지표는 손실 함수이다. - 평균 제곱 오차 $$E=\frac{1}{2}\sum_{k}^{} (y_k-t_k)^2$$ 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] y1 = [0.1,0.05,0.6,0...
퍼셉트론에서 신경망으로(4) 신경망의 구조를 조금 알게 되었으니 MINIST를 사용하여 신경망이 이미지를 분류하게 만들어본다. 이와 같은 추론 과정을 순전파(forward propagation)라고 한다. 링크에 들어가 MINIST 파일을 받을 수 있는 mnist.py 를 다운로드 한다 import sys, os from minist import load_mnist (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False) print(x_train.shape) print(t_train.shape) print(x_test.shape) print(t_test.shape) 실행하여 올바른 결과가 나오는지 확인해본다. ministy.py에서 load_mn..