Programming/python-numpy

3차원 텐서 전치에 대해서 알아보자. (tensorflow, numpy transpose)

방황하는 데이터불도저 2023. 9. 20. 00:33

2차원 행렬은 원소의 값들에 대해 행과 열의 위치를 바꾸는 것으로 전치를 할 수 있다. 2차원 행렬의 전치는 단순하지만 3차원 텐서부터는 전치되는 값이 헷갈리기 시작한다. 따라서, 해당 글에서는 3차원 텐서를 전치시킬 수 있는 경우들과 전치가 어떻게 되는지 쉽게 설명해보려하였다.
 
먼저, tensorflow로 샘플데이터를 만들어 주고, 3차원 텐서를 numpy로 형태로 만들어주었다.

import numpy as np
import tensorflow as tf

tensor_3d = tf.random.uniform(minval=0, maxval=10, shape=(1,2,3,4), dtype=tf.int32)
tensor_3d = tensor_3d.numpy().squeeze()

print(f"shape : {tensor_3d.shape}\n")
print(f"tensor_3d : \n{tensor_3d}\n")
코드 결과 : 3차원 텐서

(2 x 3 x 4) shape의 3차원 텐서는 예로 들면, channel(채널)이 2개이고, row(행/높이)가 3개, column(열/너비)가 4개인 이미지라고 생각해볼 수 있다. 즉, shape의 인덱스인 (0, 1, 2)는 (channel, row, column)으로 3*4행렬이 2개 겹쳐있는 것처럼 생각해볼 수 있다.
 
2차원 행렬의 경우에는 행과 열의 위치를 전치시키는 경우밖에 없지만 3차원 텐서의 경우에는 전치시킬 수 있는 경우가 아래처럼 다양하다.

  • 행과 열만 전치 : -> (0, 2, 1)로 전치
  • 행과 채널을 전치 : -> (1, 0, 2)로 전치
  • 열과 채널을 전치 : -> (2, 1, 0)로 전치
  • 행과 열과 채널을 모두 전치 : -> (1, 2, 0), (2, 0, 1)로 전치

* 2차원 행렬에 대한 전치는 (0,1)을 (1,0)으로 transpose하는 것이다.

 
전치시키는 함수로는 numpy의 transpose함수를 사용하면 된다. 위의 경우들을 하나하나 실행해보며 어떤식으로 전치가 되는 것인지 알아보자.

transpose1 = np.transpose(tensor_3d, (0,2,1))
print(f"shape : {transpose1.shape}\n")
print(f"tensor_3d : \n{transpose1}\n")
transpose2 = np.transpose(tensor_3d, (1,0,2))
print(f"shape : {transpose2.shape}\n")
print(f"tensor_3d : \n{transpose2}\n")
transpose3 = np.transpose(tensor_3d, (2,1,0))
print(f"shape : {transpose3.shape}\n")
print(f"tensor_3d : \n{transpose3}\n")
transpose4 = np.transpose(tensor_3d, (1,2,0))
print(f"shape : {transpose4.shape}\n")
print(f"tensor_3d : \n{transpose4}\n")
transpose5 = np.transpose(tensor_3d, (2,0,1))
print(f"shape : {transpose5.shape}\n")
print(f"tensor_3d : \n{transpose5}\n")

 
위와같이 정해진 shape인 (채널, 행, 열)에 해당되는 숫자(0:채널, 1:행, 2:열)가 무엇인지에 따라서, 그 자리에 어떤 원소값이 들어갈 것인지 정해진다고 생각할 수 있다. 한번 숫자들을 잘 따라가다보면 고차원의 텐서의 전치도 두렵지 않아질 것이다!

'Programming > python-numpy' 카테고리의 다른 글

Tensorflow, Numpy - squeeze()와 flatten()의 차이  (0) 2023.09.25