본문 바로가기
Study 공부할레나

[스터디/밑시딥3] 제 1고지 미분 자동 계산_9. 함수를 더 편리하게

by LENA-cfg 2023. 8. 15.

9.1 파이썬 함수로 이용하기

def square(x):
    return Square()(x)

def exp(x):
    return Exp()(x)

# 해당 방식으로 함수로 변경해서 쓰면 더 편해짐
x = Variable(np.array(0.5))
y = square(exp(square(x)) # 한줄로 연달아 쓸수 있음
y.grad = np.array(1.0)
y.backward()
print(x.grad)

 

9.2 backward 메서드 간소화

def backward(self):
        if self.grad is None:
            self.grad = np.ones_like(self.data)

- np.ones_like() 코드는 인풋으로 받는 데이터의 타입이 같은 ndarray 인스턴스를 생성해서, 모든 요소를 1로 채워서 돌려줌

- 스칼라를 인풋으로 받으면 스칼라를 뱉어냄

 

9.3 ndarray만 취급하기

- float, int 같은 ndarray가 아닌 데이터 타입이 들어왔을때 TypeError를 발생시키는 코드 추가

class Variable:
    def __init__(self, data):
        if data is not None:
            if not isinstance(data, np.ndarray):
                raise TypeError('{}은(는) 지원하지 않습니다.'.format(type(data)))

- numpy 특징으로 0차원의 ndarray를 제곱하면 np.float64가 되서 데이터 타입이 변함

- Variable은 데이터가 항상 ndarray 이스턴스라고 가정하고 있어서 Variable 연산 후에 ndarray로 바꿔줘야함

def as_array(x):
    '''0차원 ndarray 인스턴스는 계산 결과의 데이터 타입이 달라지기 때문에 조정해야 한다.'''
    if np.isscalar(x):
        return np.array(x)
    return x
    
class Function:
    def __call__(self, input):
        x = input.data
        y = self.forward(x)
        output = Variable(as_array(y)) # 여기에 위의 as_array() 함수를 추가해줌
        output.set_creator(self)
        self.input = input 
        self.output = output 
        return output

- 순전파의 결과인 y를 Variable로 감쌀 때 as_array()를 이용함

- 이런 경우, 0차원의 ndarray 인스턴스를 사용한 계산에서도 모든 데이터는 ndarray가 됨