Deep learning/모델 구현

28. 변수 사용성 개선

jwjwvison 2021. 10. 10. 20:10
  • 변수 이름 지정
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 # 세대 수를 기록하는 변수

 

  • ndarray 인스턴스 변수

 variable은 데이터를 담는 상자 역할을 한다. 그러나 사용하는 사람 입장에서 중요한 것은 상자가 아니라 그 안의 데이터 이다. 그래서 Variable이 데이터인 것처럼 보이게 하는 장치, 즉 상자를 투명하게 해주는 장치를 만들겠다.

 

 여기서는 Variable 인스턴스에 넘파이의 ndarray 인스턴스에 있는 shape 인스턴스 변수를 사용할 수 있게 하겠다.

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

 

 이와 같이 메서드 호출이 아닌 인스턴스 변수로 데이터의 형상을 얻을 수 있다. 같은 방법으로 ndarray의 다른 인스턴스 변수들을 Variable에 추가할 수 있다. 여기에서는 다음 세 인스턴스 변수를 더 추가하겠다.

    @property
    def ndim(self):  #차원수
        return self.data.ndim
    
    @property
    def size(self):  #원소수
        return self.data.size
    
    @property
    def dtype(self): #데이터 타입
        return self.data.dtype

 

  • len 과 print 함수
        def __len__(self):
            return len(self.data)
        
        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],[7,8,10]]))
print(x.shape)
print(len(x))
print(x)

'Deep learning > 모델 구현' 카테고리의 다른 글

30. 테일러 급수 미분  (0) 2021.10.12
29. 연산자 오버로드  (0) 2021.10.10
27. 메모리 관리  (0) 2021.10.04
26. 복잡한 계산 그래프  (0) 2021.10.04
25. 가변 길이 인수(역전파)  (0) 2021.10.04