Soohyun’s Machine-learning

Tensor manipulation 본문

Machine Learning

Tensor manipulation

Alex_Rose 2017. 10. 8. 15:30

====================================================================================

AXIS

====================================================================================



x = [[ 1., 2.,],

      [ 3., 4.]]


-------------> axis = 1

|

|

axis = 0


가장 안쪽의 축은 axis=-1이라고 한다. 여기에서는 axis=1 과 동일하다.



axis    axis    axis

0        1        2        ..... 이런식으로 축이 간다. 안쪽일수록 rank (차원) - 1이나 마찬가지임. 3차원이면 axis 2가 가장 안쪽 축.

                                  일일이 계산하는 번거로움이 있으므로 그냥 가장 안쪽축은 axis = -1 로 손쉽게 쓰면 된다.

[        [        [

 





tf.reduce_sum(x).eval()            # 결과값: 10.0             # 전체를 sum한 것


tf.reduce_sum(x, axis=0).eval()   # 결과값: array([4., 6.], dtype=float32)        # axis=0 즉, 세로의 값끼리 더한 것


tf.reduce_sum(x, axis=1).eval()    # 결과값: array([3., 7.], dtype=float32)        # axis=1 가로의 값끼리 sum 한 것


tf.reduce_mean(tf.reduce_sum(x, axis=-1)).eval()        # 결과값 : 5.0        # 가장 안쪽의 축을 기준으로 sum해주고 그 값의 평균을 낸 것.






====================================================================================

ARGMAX

====================================================================================


argmax는 가장 큰 값이 있는 '위치' (index)를 구한다.



x = [[0, 1, 2],

[2, 1, 0]]


tf.argmax(x, axis=0).eval()        # 결과값: array([1, 0, 0])        # 세로축을 기준으로 가장 큰 값을 구해라...에서 첫번째 column인 0과 2중에선

# 2가 더 큰 값이니 1, 두번째 1과 1에서는 첫번째 1이 체크되어 0, 세번째 2와 0에서는 2가 더 크니 0으로 체크됨

# 그래서 결과가 1, 0, 0    이 나오게 된다.



tf.argmax(x, axis=1).eval()        # 결과값: array([2, 0])            # 가로축을 기준으로 가장 큰 값을 구해라- 0, 1, 2 중에서는 2번째가 젤 크니 2

# 2, 1, 0에서는 0번째에 있는 2가 가장 크므로 0.     그래서 결과값이 2, 0



tf.argmax(x, axis=-1).eval()       # 결과값: array([2, 0])            # 위와 동일한 과정을 거치므로 결과값이 같다.








====================================================================================

RESHAPE

====================================================================================


t = np.array([[[0, 1, 2],

 [3, 4, 5]],


[[6, 7, 8],

 [9, 10, 11]]])



t.shape                    # 결과값: (2, 2, 3)               




tf.reshape(t, shape=[-1, 3]).eval()                # 보통 뒤쪽의 3 << 여기 부분, 안쪽 값은 건드리지 않는다.


결과값: 

array([[ 0, 1, 2 ],

   [ 3, 4, 5 ],

   [ 6, 7, 8 ],

   [ 9, 10, 11 ]])




tf.reshape(t, shape=[-1, 1, 3]).eval()           # rank를 늘리고 싶을땐 이렇게 쓰면 됨


결과값: 

array([[[ 0, 1, 2 ]],

   [[ 3, 4, 5 ]],

   [[ 6, 7, 8 ]],

   [[ 9, 10, 11 ]])





====================================================================================

RESHAPE (SQUEEZE, EXPAND)

====================================================================================


tf.squeeze([[0], [1], [2]]).eval()            # array([0, 1, 2], dtype=float32)


# 하나로 펴줌


tf.expand_dim([0, 1, 2], 1).eval()        # array([[0],

  [1],

  [2]], dtype=int32)





====================================================================================

ONE HOT

====================================================================================


tf.one_hot([[0], [1], [2], [0]], depth=3).eval()


결과값:

array)[[[    1.,    0.,    0.    ]],                                 # 0번째 자리에 1

   [[    0.,    1.,   0.    ]],                                  # 1번째 자리에 1

   [[    0.,    0.,    1.    ]],                                 # 2번째 자리에 1

   [[    1.,    0.,    0.    ]]],     dtype=float32)        # 0번째 자리에 1





t = tf.one_hot([[0], [1], [2], [0]], depth=3)

tf.reshape(t, shape=[-1, 3]).eval()


결과값: 

array([[ 1., 0., 0.,],                

   [  0., 1., 0.],

   [  0., 0., 1.],

   [  1., 0., 0.]], dtype=float32)






====================================================================================

CASTING

====================================================================================



tf.cast([[    1.8,    2.2,    3.3,    4.9    ],    tf.int32).eval()                # integer로 바꿀래~


결과값: array([1, 2, 3, 4], dtype=int32)




tf.cast([True, False, 1 == 1, 0 == 1], tf.int32).eval()                       # true or false를 0이나 1의 integer로 바꾼다.


결과값: array(1, 0, 1, 0], dtype=int32)                                        # true라서 1, false라서 0, 1==1은 true니까 1, 0==1은 false니까 0






====================================================================================

STACK

====================================================================================



x = [1,4]

y = [2, 5]

z = [3, 6]


# pack along first dim.

tf.stack([x, y, z]).eval()




결과값:

array([[1, 4],

   [2, 5],

   [3, 6]], dtype=int32)






tf.stack([x, y, z], axis=1).eval()


결과값:

array([[1, 2, 3],

        [4, 5, 6]], dtype=int32)










====================================================================================

ZIP

====================================================================================



for x, y in zip([1, 2, 3], [4, 5, 6]):

print(x, y)



결과값:

1    4

2    5

3    6





for x, y, z in zip([1, 2, 3], [4, 5, 6], [7, 8, 9]):

print(x, y, z)



결과값:

1    4    7

2    5    8

3    6    9



'Machine Learning' 카테고리의 다른 글

레노버 초반 세팅  (0) 2022.10.31
Kaggle preprocessing & feature engineering process flow  (0) 2019.04.08
[Reinforcement Learning] preliminaries  (0) 2018.11.04
Linear regression  (0) 2018.04.17
텐서플로 공부  (0) 2017.10.08
Comments