개인 공부 공간/딥러닝

밑바닥부터 시작하는 딥러닝3 - STEP 19

Hoon Kang 2021. 3. 15. 18:14

변수 이름 지정

다양한 변수를 구분짓기 위해 변수에 이름을 지정해줄 수 있도록 Variable 클래스 코드에 수정이 필요하다.

 

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

    self.data = data
    self.name = name
    self.grad = None
    self.creator = None
    self.generation = 0

  ....

 

이제 x = Variable(np.array(1.0), 'input_x') 라고 작성하면 변수명은 input_x 가 된다.

ndarray 인스턴스 변수

STEP 1에서 언급했듯이 Variable 은 데이터를 담는 상자 역할을 한다. 하지만 이용자 입장에서는 그 상자 안에 담겨있는 데어티이다. 그래서 이번 단계에서는 Variable 이 데이터처럼 보이도록 즉, 상자를 투명하게 해주는 장치를 구현하였다. 다르게 말하면 Variable 인스턴스를 ndarray 인스턴스처럼 보이도록 하였다.

 

class Variable:
    ....

    @property
    def shape(self):
        return self.data.shape

 

shape 메서드를 구현해 실제 데이터의 형태를 반환하도록 하였다. 여기서 핵심은 @property 를 이용해 shape 메서드를 인스턴스 변수처럼 사용할 수 있게 된 부분이다.

 

x = Variable(np.array([[1,2,3], [4,5,6]]))
print(x.shape)

 

실행 결과

(2, 3)

len 함수와 print 함수

Variable 클래스를 확장하여 파이썬의 len 함수와도 함께 사용할 수 있도록 수정하였다.

 

class Variable:
    ....

    def __len__(self):
        return len(self.data)

 

이제 Variable 인스턴스에 대해서도 len 함수를 사용할 수 있게 되었다.

 

x = Variable(np.array([[1,2,3], [4,5,6]]))
print(len(x))

 

실행 결과

2

 

마지막으로 Variable 인스턴스를 print함수에 건네면 안에 담긴 ndarray 인스턴스의 내용을 출력하는 기능을 추가하였다.

 

class Variable:
    ....

    def __repr__(self):
    if self.data is None:
      return 'variable(None)'
    p = str(self.data).replace('\n', '\n' + ' ' * 9)
    return 'variable(' + p + ')'
x = Variable(np.array([[1,2,3], [4,5,6]]))
print(repr(x))

 

실행 결과

variable([[1 2 3]
          [4 5 6]])

출처:- 사이토 고키, 『밑바닥부터 시작하는 딥러닝3』, 개앞맵시, 한빛미디어(2020)