[머신러닝] Tensor 데이터 처리하기 Part.1
Tensor manipulation
더욱 깊은 이론으로 들어가기 전에 기본으로 돌아가보자. Tensor
를 손쉽게 다룰 수 있어야 이후 과정이 편해진다. 사실 기본이다.
Simple ID Array and Slicing
Array
는 조각으로 자른 김밥과 비슷하다. 순서대로 나열되어 있는 데이터 집합이다. 다만 순서의 시작이 1
이 아닌 0
부터 시작한다는 점이 차이점이다.
import numpy as np
import pprint as pp
# one dimension array
t = np.array([0., 1., 2., 3., 4., 5., 6.])
pp.pprint(t)
print(t.ndim) # rank
print(t.shape) # shape
1차원의 Array
를 만든 후 ndim
과 shape
메소드로 각각 차원
과 형태
를 알아볼 수 있다.
array([0., 1., 2., 3., 4., 5., 6.])
1
(7,)
위 Array
는 1차원
의 (7)
이라는 형태를 가지고 있다. 하나의 차원에 7개의 요소를 가지고 있다는 의미다.
# slice
print(t[0], t[1], t[-1])
print(t[2:5], t[4:-1])
print(t[:2], t[3:])
더불어 기본적인 파이썬과 같이 Slicing
도 가능하다.
0.0 1.0 6.0
[2. 3. 4.] [4. 5.]
[0. 1.] [3. 4. 5. 6.]
하나하나의 요소를 가지고 올 수도 있고, 특정 범위를 잘라낼 수도 있다.
2D Arrary
t = np.array([[1.,2.,3.], [4.,5.,6.], [7.,8.,9.], [10.,11.,12.]])
pp.pprint(t)
print(t.ndim) # rank
print(t.shape) # shape
이번에는 조금 더 복잡해진 Array
를 살펴보자. 몇 차원의 어떤 형태를 가지고 있을까.
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 9.],
[10., 11., 12.]])
2
(4, 3)
먼저 차원은 2
다. 꼼수처럼 보일 수 있지만 맨 앞의 [
, 즉 대괄호 숫자를 세면 차원을 알아낼 수 있다. 2개의 대괄호를 가지고 있으므로 2차원 Array
다. 차원이 2
라는 뜻은 형태를 나타내는 숫자도 2개라는 것이다. 형태는 (?, ?)
로 표현되는데, ?
의 개수는 차원의 개수와 같다.
가장 기본적인, 깊숙히 들어가있는 최소 단위의 데이터 집합을 먼저 봐야 한다. element
가 3개
들어있는 리스트를 4개
발견할 수 있다. Array
의 형태를 뒤에서부터 적어가면 된다. 따라서 (4, 3)
의 형태로 표현된다.
Shape, Rank, Axis
import tensorflow as tf
t = tf.constant([1,2,3,4])
print(t.get_shape())
이제 실제로 Tensor
를 구현해보자. 다행히 get.shape()
메소드를 사용해 형태를 바로 알아낼 수 있다.
(4,)
일단 대괄호가 하나이므로 차원은 1
이고, 4개의 요소가 들어있는 데이터 뭉치가 하나만 있으므로 형태는 (4)
로 표현할 수 있다.
t = tf.constant([[1,2],
[3,4]])
print(t.get_shape())
조금 더 복잡한 형태라도 마찬가지로 적용해보면,
(2, 2)
(2, 2)
라는 형태를 찾아낼 수 있다.
t = tf.constant([[[[1,2,3,4], [5,6,7,8], [9,10,11,12]],
[[13,14,15,16], [17,18,19,20], [21,22,23,24]]]])
print(t.get_shape())
갑자기 중간 없이 너무 복잡해졌다. 하지만 기본적인 법칙은 똑같다. 일단 너무 다닥다닥 붙어있으니 풀어서 보자.
[
[
[
[1,2,3,4],
[5,6,7,8],
[9,10,11,12]
],
[
[13,14,15,16],
[17,18,19,20],
[21,22,23,24]
]
]
]
일단 앞에 있는 대괄호의 숫자는 총 4개이므로 4차원 Array
다. 따라서 Array
의 형태는 (?, ?, ?, ?)
로 표현된다. 가장 깊숙한 데이터 집합을 보자. 총 4개의 숫자가 하나의 묶음으로 묶여있다. 따라서 형태의 가장 마지막 물음표는 4
가 되고, 형태는 (?, ?, ?, 4)
로 표현된다.
4개의 데이터가 묶여있는 또 하나의 집합은 3개씩 묶여있다. 살펴보니 그 뭉치가 총 2개다. 따라서 형태는 (?, 2, 3, 4)
인 것을 알 수 있다. 마지막으로 가장 큰 데이터 뭉치가 하나이므로 Array
의 최종적인 형태는 (1, 2, 3, 4)
다.
(1, 2, 3, 4)
물론 get_shape()
메소드를 사용하면 단 번에 알 수 있다.
Axis
[ # axis = 0
[ # axis = 1
[ # axis = 2
[1,2,3,4], # axis = 3 = -1
[5,6,7,8],
[9,10,11,12]
],
[
[13,14,15,16],
[17,18,19,20],
[21,22,23,24]
]
]
]
또 한가지 중요한 개념이 있다. Axis
, 즉 축이다. 가장 큰 범주의 차원부터 axis = 0
이고 총 차원의 개수(n) - 1만큼 축이 생성된다. 위 Array
는 4차원이므로 axis = 3
까지 있는 것이다.
그리고 가장 안쪽의 축은 axis = -1
로 표현하기도 한다. 실무적으로 많이 사용되는 개념이다. 큰 범위의 차원을 바꾸는 경우는 있어도 가장 기본 데이터가 속해있는 마지막 축은 바꾸는 경우가 극히 드물기 때문이다.
짱짱맨 호출에 출동했습니다!!