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가 됨
'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 2고지 자연스러운 코드로_11. 가변 길이 인수(순전파 편) (0) | 2023.08.15 |
|---|---|
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_10. 테스트 (0) | 2023.08.15 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_8. 재귀에서 반복문으로 (0) | 2023.08.13 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_7.역전파 자동화 (0) | 2023.08.13 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_6.수동 역전파 (0) | 2023.08.13 |