수학과의 좌충우돌 프로그래밍

[딥러닝]03.텐서연산 본문

인공지능/케라스창시자에게 배우는 딥러닝

[딥러닝]03.텐서연산

ssung.k 2019. 3. 15. 05:12
텐서연산


텐서 연산

브로드 캐스팅

놀랍게도 2D 텐서와 벡터를 더할 수 있다. 두 텐서는 크기가 다른데 어떻게 더해질 수 있을까?

작은 텐서가 큰 텐서에게 맞춰져서 더해지게 되는데 이를 브로드 캐스팅 이라고 한다.

브로드 캐스팅은 다음과 같은 단계로 실행된다.

  1. 큰 텐서의 ndim에 맞도록 작은 텐서에 축이 추가된다.
  2. 작은 텐서가 새 축을 따라서 큰 텐서의 크기에 맞도록 반복된다.

예를 통해 알아보자.

x의 크기는 (32.10) 이고 y의 크기는 (10,) 일 때, 1번에 의해 y에 비어있는 축을 추가하여 크기를 (1,10) 으로 만든다. 그 후 y를 32번 반복하면 텐서 y의 크기는 (32,10)이 된다.

이를 코드로 구현해보자.

def braodcast(x,y):
    assert len(x.shape) == 2
    assert len(y.shape) == 1
    assert x.shape[1] == y.shape[0]
    
    x = x.copy()
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            x[i,j] += y[j]
    return x
  • assert 는 뒤의 조건이 False일 경우 에러를 발생시킨다.

 

텐서 크기 변환

텐서의 크기를 변환한다는 것의 의미는 열과 행을 재배치 하는 것을 의미한다. 당연히 크기가 변환된 텐서와 원래의 텐서는 원소수가 동일하다.

x = np.array([[0,1],
              [2,3],
              [4,5]])
>>> x.shape
(3,2)
x = x.reshape(2,3)
>>> x
array([[0, 1, 2],
       [3, 4, 5]])

특별한 크기 변환으로 전치가 있습니다. 행렬의 전치는 행과 열을 바꾸는 것을 의미합니다.

x = np.array([[0,1],
              [2,3],
              [4,5]])
>>> x.shape
(3,2)
x = np.transpose(x)
>>> x
array([[0, 2, 4],
       [1, 3, 5]])

 

Comments