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

[스터디/밑시딥3] 제 2고지 자연스러운 코드로_19. 변수 사용성 개선

by LENA-cfg 2023. 8. 26.

19.1 변수 이름 지정

변수에 이름을 붙여줄 수 있도록 설정합니다.

class Variable:
    def __init__(self, data, name=None): #2.초기화 인수 추가
        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 # 1.Variable 클래스에 name 이라는 인스턴스 변수 추가
        self.grad = None
        self.creator = None
        self.generation = 0

x = Variable(np.array(1.0), 'input_x') # 3. 실제사용: 변수 x의 이름은 input_x가 됨

*변수에 이름을 붙일 수 있으면, 계산 그래프를 시각화 할 때 변수 이름을 그래프에 표시할 수 있습니다.

19.2 ndarray 인스턴스 변수

사용자 입장에서 Variable 속 데이터가 중요한데 Variable이 데이터인 것 처럼 보이게 하는 장치가 필요합니다.

다차원 배열용 인스턴스 변수인 shape는 다차원 배열의 형상을 알려줍니다.

class Variable:

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

# 실제 호출
x = Variable(np.array([[1, 2, 3], [4, 5, 6]]))
print('x의 shape:', x.shape)

해당 방법 처럼 메서드 호출이 아닌 인스턴스 변수로 데이터의 형상을 얻을 수 있습니다.

ndarray의 다른 인스턴스 변수인 ndim, size, dtype을 Variable에 추가하겠습니다.

class 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

19.3 len 함수와 print 함수

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

# 실제 사용
x = Variable(np.array([[1, 2, 3], [4, 5, 6]]))
print('x의 shape:', x.shape)

__len__이라는 특수 메서드를 구현하여 Variable 인스턴스에 len함수를 사용할 수 있게 됩니다.

class Variable:

    def __repr__(self):
        if self.data is None:
            return 'variable(None)'
        p = str(self.data).replace('\n', '\n' + ' ' * 9)
        return 'variable(' + p + ')'

print 함수를 사용해 출력 문자열을 만들어주는 코드입니다.

위의 코드에서는 str(self.data)를 이용하여 ndarray 인스턴스를 문자열로 변환했습니다.

str 함수 안에는 ndarray 인스턴스의 __str__함수가 호출되고 숫자가 문자열로 변환됩니다.

줄바굼이 있으면 줄을 바꾸고 새로운 줄 앞에 공백 9개를 삽입하여 여러 줄에 걸친 출력도 숫자의 시작 위치가 가지런해지도록 효시되게 했습니다.

 

마지막으로 변환된 문자열을 'variable(..)'형태로 감쌉니다.

# 실행 코드
x = Variable(np.array([[1, 2, 3], [4, 5, 6]]))
print('x의 shape:', x.shape)
print('x의 ndim:', x.ndim)
print('x의 size:', x.size)
print('x의 dtype:', x.dtype)
print('x의 len:', len(x))
print(x)