rueki

밑바닥부터 시작하는 딥러닝3 1~4단계 본문

DL

밑바닥부터 시작하는 딥러닝3 1~4단계

륵기 2020. 12. 14. 22:10
728x90
반응형

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)

 

 

728x90
반응형
Comments