본문 바로가기
컴퓨터 언어/Python_Tensorflow

[Tensorflow 2] tf.concat , axis = -1, 0, 1 의미

by SuperMemi 2020. 3. 12.
반응형

 

[Tensorflow 2] tf.concat , axis = -1, 0, 1 의미

 


 

tf.concat(
    values
, axis, name='concat'
)

 

tf.concat 은 단순하게 설명하자면, 장난감 블록을 붙이듯 axis 축에 대하여 자료를 합체시키는 것이다.

 

이때, 중요한 것은 자료들의 차원이 같아야한다.

또한, 붙이려는 방향의 블록 구조가 같아야 한다.

자료들안의 '[ ]' 의 개수와 위치로 자료의 구조를 알 수 있다.


행렬의 shape에 집중해서 보자.

 

( 2차원, 1차원 ) 으로 위치를 생각하면 쉽다.

( axis=0 , axis=1 )

( axis=-2 , axis =-1 )

 

3차원이 된다면 앞쪽에 숫자하나를 더 넣어주면 된다.

( 3차, 2차, 1차 ) 이런식으로 차원이 추가 될 수록 덧붙여진다.

( axis=0, axis=1, axis=2)

( axis=-3, axis=-2 , axis =-1 )

 


1. axis = 0

 

>>> t1 = [[1, 2, 3], [4, 5, 6]]      # dim = 2
>>> t2 = [[7, 8, 9], [10, 11, 12]]   # dim = 2 
>>> tf.concat([t1, t2],0)            # axis = 0
<tf.Tensor: shape=(4, 3), dtype=int32, numpy=
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])>               # dim = 2

t1 과 t2는 모두 2차원 ( 2 X 3 )행렬이라고 생각하자.

axis 는 붙이는 축이라고 생각하면 쉽다.

 

axis = 0 이라는건 가장 높은 차원을 기준으로 합치는 것이다. 

 

모두 2차원의 행렬이니 1차원은 그대로 두고 2차원의 위치를 붙여준다.

결과는 (4 X 3) 행렬이 나온다.


3차원 tensor 자료는 어떻게 합쳐질까?

>>> t1 = [[[1, 2, 3], [4, 5, 6]]]
>>> t2 = [[[7, 8, 9], [10, 11, 12]]]
>>> tf.concat([t1, t2],0)
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])>

t1 과 t2는 모두 3차원 ( 1 X 2 X 3 ) tensor라고 생각하자.

위의 2차원 모양과 달라진 것이 있다면 차원이 추가 된 것 뿐이다.

 

이번에는 차원이 3차원이다. 

두 tesnor를 axis = 0에 tf.concat 하면 1,2 차원의 모양은 그대로 두고,

자연스럽게 ( 2 X 2 X 3 )의 모양이 된다.

 


자 이번에는 숫자는 같지만, t1, t2의 shape이 다르다. 결과 또한 다르다.

>>> t1 = [[[1, 2, 3]], [[4, 5, 6]]]
>>> t2 = [[[7, 8, 9]], [[10, 11, 12]]]
>>> tf.concat([t1, t2],0)
<tf.Tensor: shape=(4, 1, 3), dtype=int32, numpy=
array([[[ 1,  2,  3]],

       [[ 4,  5,  6]],

       [[ 7,  8,  9]],

       [[10, 11, 12]]])>

t1 과 t2는 모두 여전히 3차원이지만, ( 2 X 1 X 3 ) tensor 이다.

axis = 0 대해서 붙이면 ( 4 X 1 X 3 ) tensor가 되는 것을 알 수 있다.

가장 높은 3차원을 기준으로 붙이는 것이다.

차이를 알겠는가?

 

모르겠다면 예제에서 괄호 '[ ]' 의 위치와 개수를 다시한번 보기를 바란다.

 

 


2. axis = 1

 

 

위의 예제를 이해했다면 

 

axis = 0 은 제일 높은 차원을 기준으로 합쳤다는 것을 안다.

axis = 1 은 두 번째로 높은 차원을 기준으로 합치는 것이다. 

2차원 자료라면 -> 1차원을 기준으로 붙이고

3차원 자료라면 -> 2차원을 기준으로 붙이면 된다.


예제를 통해 알아보자

>>> t1 = [[1, 2, 3], [4, 5, 6]]
>>> t2 = [[7, 8, 9], [10, 11, 12]]
>>> tf.concat([t1, t2],1)
<tf.Tensor: shape=(2, 6), dtype=int32, numpy=
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])>

 

t1 과 t2는 모두 2차원 ( 2 X 3 ) 행렬 (matrix) 이다.

axis = 1 일 때, 1차원을 기준으로 붙여주면 ( 2 X 6 ) 행렬이 된다.

 


자료가 3차원 일때도 똑같다.

>>> t1 = [[[1, 2, 3]], [[4, 5, 6]]]
>>> t2 = [[[7, 8, 9]], [[10, 11, 12]]]
>>> tf.concat([t1, t2],1)
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1,  2,  3],
        [ 7,  8,  9]],

       [[ 4,  5,  6],
        [10, 11, 12]]])>

t1 과 t2는 모두 3차원이고, 크기가 ( 2 X 1 X 3 ) 인 tensor 이다.

axis = 1 에 대해서 tf.concat 했을때, 2차원을 기준으로 붙이고,

( 2 X 2 X 3 ) tensor가 만들어 짐을 알 수 있다.

 

햇갈린다면, [ ] 의 위치와 개수를 다시한번 확인해 보기 바란다.

 

 

3차원일때 axis =2도 가능하고, 이때에는 1차원을 기준으로 붙여주면 된다.

 

이런식으로 axis는 자료의 차원(dim)에 따라서 달라지고 적용할 때 주의 해야된다.

 

 

 

axis 가 만약 음수라면 어떻게 될까?


3. axis = -1 

 

 

axis = -1 은 가장 낮은 차원 뒤쪽에서부터 시작한다. 

자료가 2차원이라면 -> 1차원을 기준으로 붙인다,

( axis=0 , axis=1 ) 

( axis=-2 , axis =-1 ) 같은 의미 이다.


예를 통해 이해해 보자.

>>> t1 = [[1, 2, 3], [4, 5, 6]]
>>> t2 = [[7, 8, 9], [10, 11, 12]]
>>> tf.concat([t1, t2],-1)                     # axis = -1
<tf.Tensor: shape=(2, 6), dtype=int32, numpy=
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])>
       
>>> tf.concat([t1, t2],1)                      # axis = 1
<tf.Tensor: shape=(2, 6), dtype=int32, numpy=
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])>

자료가 2차원이고 axis = -1 이면 1차원에서 붙이라는 의미이다.

axis =1 일때와 결과가 같다.

 


3차원일 때, 더 잘 이해가 될 것이다.

 

자료가 3차원이라면 -> 1차원을 기준으로 붙인다.

( axis=0, axis=1, axis=2)

( axis=-3, axis=-2 , axis =-1 ) 같은 의미이다.

>>> t1 = [[[1, 2, 3]], [[4, 5, 6]]]
>>> t2 = [[[7, 8, 9]], [[10, 11, 12]]]
>>> tf.concat([t1, t2],-1)                        # axis = -1
<tf.Tensor: shape=(2, 1, 6), dtype=int32, numpy=
array([[[ 1,  2,  3,  7,  8,  9]],

       [[ 4,  5,  6, 10, 11, 12]]])>
       
>>> tf.concat([t1, t2], 2)                        # axis = 2       
<tf.Tensor: shape=(2, 1, 6), dtype=int32, numpy=
array([[[ 1,  2,  3,  7,  8,  9]],

       [[ 4,  5,  6, 10, 11, 12]]])>

자료가 3차원 이기 때문에 똑같이 가장 낮은 1차원에서 붙인다.

t1 과 t2는 모두 3차원이고, 크기가 ( 2 X 1 X 3 ) 인 tensor 이다.

axis = -1의 결과는 크기가 ( 2 X 1 X 6 ) 인 tensor 이다.

 

 

이런식으로 조절할 수 있다.

반응형