rueki
밑바닥부터 시작하는 딥러닝3 1~4단계 본문
1단계 : 상자로서의 변수
변수 : 물건을 담는 상자역할로 데이터를 저장하는 공간의 이름으로 볼 수 있음
import numpy as np
class Variable:
def __init__(self,data):
self.data = data
data = np.array(1.0)
x = Variable(data)
print(x.data)
# 1.0
variable 이라는 class 생성
인스턴스 변수 data는 물건과 같으며 Variable Class는 상자와 같다.
위에서 x는 데이터를 담는 상자 역할을 한다.
2단계 : 변수를 낳는 함수
함수 : 어떤 변수로부터 다른 변수로의 대응관계를 정한 것
class Function:
def __call__(self, input):
x = input.data
y = x ** 2
output = Variable(y)
return output
call 메서드는 호출 가능한 객체로 만들어주는 메서드 이다.
x = Variable(np.array(10))
f = Function()
y = f(x)
y.data를 출력하면 100이 나오게된다.
f를 Function으로 정의했지만 사실 Function(x)해서 호출 사용이 가능하다.
class Function:
def __call__(self,input):
x = input.data
y = self.forward(x)
output = Variable(y)
return output
def forward(self, x):
raise NotImplementedError()
forward 에서 구체적 연산을 실행할 것이며 Function은 호출함수이기에 계산 구현은 따로 구현한다.
class Square(Function):
def forward(self, x):
return x ** 2
Square 함수가 Function을 상속 하기에 call 메서드는 그대로 이어진다.
즉 스퀘어함수를 실행하면 Function의 기능이 같이 행해진다는 뜻이다.
3. 함수연결
class Exp(Function):
def forward(self,x):
return np.exp(x)
Function 클래스에서 call 메서드는 입출력 모두 Variable 인스턴스이다.
이로써 함수 간의 연결이 가능해진다.
x -> A -> a -> B -> b -> C -> y
x, a, b,y는 모두 Variable 인스턴스고, A, B, C는 함수이다.
4. 수치 미분
미분 : 변화율 == 극한으로 짧은 시간에서의 변화량 (순간의 변화량)
수치 미분 (numerical differentiation)
: 컴퓨터는 극한 계산이 불가하기에 0.00001과 같은 매우 작은 값으로 함수의 변화량을 구한다.
중앙차분으로 근사 오차를 줄인다.
f(x-h) 와 f(x+h)의 차이를 구한다.
def numerical_diff(f, x, eps = 1e-4):
x0 = Variable(x.data - eps)
x1 = Variable(x.data + eps)
y0 = f(x0)
y1 = f(x1)
return (y1.data - y0.data) / (2*eps)
'DL' 카테고리의 다른 글
You Only Look Once : Unified, Real-Time Object Detection (0) | 2021.02.28 |
---|---|
An Improved Faster R-CNN for Small Object Detection (0) | 2021.02.23 |
Generative Adversarial Nets (GAN) 논문, 코드 리뷰 (0) | 2020.12.03 |
Attention과 Transformer 까지 정리 (0) | 2020.09.10 |
딥러닝 Optimization 함수 정리 (0) | 2020.08.26 |