앞으로 우리는 수많은 변수를 처리할 것이라서 변수들을 서로 구분할 필요가 없습니다. 변수에 '이름'을 붙여줄 수 있도록 설정하면 해결되겠군요. 그래서 다음과 같이 Variable클래스에 name이라는 인스턴스 변수를 추가했습니다.
class Variable:
def __init__(self, data, name=None):
if data is not None:
if not isinstance(data, np.ndarray):
raise TypeError('{} is not supported', format(type(data)))
self.data = data
self.name = name
self.grad = None
self.creator = None
self.generation = 0
def set_creator(self, func):
self.creator = func
self.generation = func.generation + 1
def backward(self, retain_grad=False):
if self.grad is None:
self.grad = np.ones_like(self.data)
funcs = []
seen_set = set()
def add_func(f):
if f not in seen_set:
funcs.append(f)
seen_set.add(f)
funcs.sort(key=lambda x: x.generation)
add_func(self.creator)
while funcs:
f = funcs.pop()
# 수정전 gys = [output.grad for output in f.outputs]
gys = [output().grad for output in f.outputs] #
gxs = f.backward(*gys)
if not isinstance(gxs, tuple):
gxs = (gxs,)
for x, gx in zip(f.inputs, gxs):
if x.grad is None:
x.grad = gx
else:
x.grad = x.grad + gx
if x.creator is not None:
add_func(x.creator)
if not retain_grad:
for y in f.outputs:
y().grad = None # y는 약한 참조(weakref)
def cleargrad(self):
self.grad = None
이와 같이 초기화 인수 name=None을 추가하고 그 값을 인스턴스 변수 name에 설정합니다. 이제 예컨대 x = Variable(np.array(1.0)), 'input_x')라고 작성하면 변수 x의 이름은 input_x가 됩니다. 아무런 이름도 주지 않으면 변수명으로 None이 할당됩니다.
변수에 이름을 붙일 수 있다면, 예컨대 계산 그래프를 시작화할 때 변수 이름을 그래프에 표시할 수 있습니다. 계산 그래프 시각화는 25단계와 26단계를 참고하세요.
댓글 없음:
댓글 쓰기