Programming/python-deep learning

Tensor란 무엇인가? (+ Python Numpy Tensor 구현 및 기본 기능)

방황하는 데이터불도저 2023. 8. 31. 19:28

Tensor란 무엇일까?

우리는 중고등학생때, 스칼라, 벡터, 행렬까지 배웠다.

0차원인 스칼라, 1차원인 벡터, 2차원인 행렬,,, 그럼 3차원부터는?! 그게 바로 텐서라고 하는 것이다.

3차원 이상은 모두 텐서의 형태로 표현해주고, 이러한 텐서 형태를 가져와서 스칼라, 벡터, 행렬도 텐서로써 표현해줄 수도 있다.

편의상 모든 값들을 텐서형태로 정의해주는 것으로 보면 되고, 아래의 표가 모든 텐서 종류들을 정리한 내용이다.

 

텐서의 종류 텐서의 종류
(영어)
형태의 명칭 형태의 명칭 (영어)
0차원 텐서 Zeroth-order Tensor 스칼라 Scalar
1차원 텐서 First-order Tensor 벡터 Vector
2차원 텐서 Second-order Tensor 행렬 Matrix
3차원 텐서 Third-order Tensor 텐서 Tensor
4차원 텐서 Fourth-order Tensor 3차원 텐서를 쌓아올린 형태
5차원 텐서 Fifth-order Tensor 4차원 텐서를 옆으로 확장한 형태

 

출처 : PyTorch로 시작하는 딥러닝 입문

 

아래에는 numpy로 각 차원의 텐서를 만들어 본 예시들이다.

넘파이 어레이의 기본 함수 기능으로는 아래와 같은 정보를 얻을 수 있다.

  • ndim : 텐서의 차원을 출력
  • shape : 텐서의 형태를 출력
  • size : 텐서의 크기(원소의 개수)를 출력

 

1.  0차원 텐서  v  ← scalar 입력 (실수형 데이터)

t0 = np.array(5.)
print("Value of t0 : ", t0)
print("Rank of t0 : ", t0.ndim)
print("Shape of t0 : ", t0.shape)
print("Size of t0 : ", t0.size)


Value of t0 :  5.0
Rank of t0 :  0
Shape of t0 :  ()
Size of t0 :  1

 

2. 1차원 텐서  [ v, v ]  ← vector 입력 (여러개 feature에 대한 1개 row data값)

t1 = np.array([0., 1., 2., 3., 4., 5.])
print("Value of t1 : ", t1)
print("Rank of t1 : ", t1.ndim)
print("Shape of t1 : ", t1.shape)
print("Size of t1 : ", t1.size)

Value of t0 :  [0. 1. 2. 3. 4. 5.]
Rank of t0 :  1
Shape of t0 :  (6,)
Size of t0 :  6

 

3. 2차원 텐서  [ [ v, v ], [ v, v ] ]  ←  matrix 입력 (여러 rows 데이터셋 = 1차원 텐서의 minibatch)

t2 = np.array([ [0., 1.], [2., 3.], [4., 5.] ])
print("Value of t2 : ", t2)
print("Rank of t2 : ", t2.ndim)
print("Shape of t2 : ", t2.shape)
print("Size of t2 : ", t2.size)


Value of t2 :  [[0. 1.]
 [2. 3.]
 [4. 5.]]
Rank of t2 :  2
Shape of t2 :  (3, 2)
Size of t2 :  6

 

 

4. 3차원 텐서   [ [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ] ] ← 3개의 matrix를 엮은 tensor 입력  (이미지 데이터)

t3 = np.array([ [ [0., 1.], [2., 3.], [4., 5.] ], [ [6., 7.], [8., 9.], [10., 11.] ] ])
print("Value of t3 : ", t3)
print("Rank of t3 : ", t3.ndim)
print("Shape of t3 : ", t3.shape)
print("Size of t3 : ", t3.size)


Value of t3 :  [[[ 0.  1.]
  [ 2.  3.]
  [ 4.  5.]]

 [[ 6.  7.]
  [ 8.  9.]
  [10. 11.]]]
Rank of t3 :  3
Shape of t3 :  (2, 3, 2)
Size of t3 :  12

 

 

5. 4차원 텐서 

[ [ [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ] ],  [ [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ],  [ [ v, v ], [ v, v ] ] ],  [ [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ], [ [ v, v ], [ v, v ] ] ] ]  ← 3개의 3차원 텐서를 엮은 tensor 입력 (여러개의 이미지 데이터 = 3차원 텐서의 minibatch)

t4 = np.array([ [ [0., 1.], [2., 3.], [4., 5.] ], [ [6., 7.], [8., 9.], [10., 11.] ], [ [12., 13.], [14., 15.], [16., 17.] ], [ [18., 19.], [20., 21.], [22., 23.] ], [ [24., 25.], [26., 27.], [28., 29.] ], [ [30., 31.], [32., 33.], [34., 35.] ] ])
print("Value of t4 : ", t4)
print("Rank of t4 : ", t4.ndim)
print("Shape of t4 : ", t4.shape)
print("Size of t4 : ", t4.size)


Value of t4 :  [[[ 0.  1.]
  [ 2.  3.]
  [ 4.  5.]]

 [[ 6.  7.]
  [ 8.  9.]
  [10. 11.]]

 [[12. 13.]
  [14. 15.]
  [16. 17.]]

 [[18. 19.]
  [20. 21.]
  [22. 23.]]

 [[24. 25.]
  [26. 27.]
  [28. 29.]]

 [[30. 31.]
  [32. 33.]
  [34. 35.]]]
Rank of t4 :  3
Shape of t4 :  (6, 3, 2)
Size of t4 :  36

 

데이터의 형태에 따라서 텐서의 차원, 형태, 크기도 달라질 것이다.본인이 사용하는 데이터의 형태, 크기는 어떤지, minibatch를 사용할 것인지, 안할 것인지 등을 고려해주고, 딥러닝 연산에 해당 데이터를 학습시키기 위해서는 학습 weight, bias의 크기도 맞춰주어야하기 때문에, 이를 파악하는 것은 매우 중요하다. 이를 위한 아주 기본적인 텐서에 대한 개념과 numpy 기본 함수를 알아보았다.

 

끝.