[머신러닝] Tensor 데이터 처리하기 Part.1

in #kr-steemit7 years ago (edited)

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를 만든 후 ndimshape 메소드로 각각 차원형태를 알아볼 수 있다.

array([0., 1., 2., 3., 4., 5., 6.])
1
(7,)

Array1차원(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개라는 것이다. 형태는 (?, ?)로 표현되는데, ?의 개수는 차원의 개수와 같다.

가장 기본적인, 깊숙히 들어가있는 최소 단위의 데이터 집합을 먼저 봐야 한다. element3개 들어있는 리스트를 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로 표현하기도 한다. 실무적으로 많이 사용되는 개념이다. 큰 범위의 차원을 바꾸는 경우는 있어도 가장 기본 데이터가 속해있는 마지막 축은 바꾸는 경우가 극히 드물기 때문이다.


Sort:  

짱짱맨 호출에 출동했습니다!!