본문 바로가기

ML & AI Theory

텐서를 다차원 배열로 변환하기

반응형

랭크 2 이상인 텐서를 다룰때 전치(transpose)같은 변환은 주의를 기울여야 합니다.

넘파이는 arr.shape속성으로 배열 크기를 얻을 수 있습니다. 텐서플로에서는 tf.get_shape함수를 사용합니다. 또는 텐서의 shape속성을 사용합니다.

 

import tensorflow as tf
import numpy as np

arr = np.array([[1.,2.,3.,3.5],[4.,5.,6.,6.5],[7.,8.,9.,9.5]])
T1 = tf.constant(arr)
s = T1.get_shape()
print('T1의 크기:', s)
print('T1의 크기:', T1.shape)
T1의 크기: (3, 4)
T1의 크기: (3, 4)
T2 = tf.Variable(np.random.normal(size=s))
print(T2)
T3 = tf.Variable(np.random.normal(size=s[0]))
print(T3)
<tf.Variable 'Variable:0' shape=(3, 4) dtype=float64, numpy=
array([[-0.4156755 , -0.37716127, -1.01864513,  1.18228051],
       [-0.77202933, -0.06663718,  1.51423624,  1.92920079],
       [-0.06983855,  1.21532911, -0.25827128, -0.49263241]])>
<tf.Variable 'Variable:0' shape=(3,) dtype=float64, numpy=array([-0.27734527,  2.79431223, -0.51732042])>

 

텐서 크기를 바꾸는 방법을 알아보겠습니다. 넘파이에서는 np.reshape이나 arr.reshape을 사용합니다. 텐서플로에서는 tf.reshape함수를 사용하여 텐서 크기를 바꿉니다. 넘파이에서처럼 차원 하나를 -1로 지정할 수 있습니다. 이 차원 크기는 배열 전체 크기와 다른 차원에 지정한 크기를 바탕으로 결정됩니다.

#tensor ver2.0
T4 = tf.reshape(T1, shape=[1,1,-1])
print(T4)
T5 = tf.reshape(T1, shape=[1,3,-1])
print(T5)

 

넘파이에는 배열을 전치할 수 있는 방법이 세가지가 있습니다. arr.T, arr.transpose(), np.transpose(arr)입니다. 텐서플로에서는 tf.transpose함수를 사용합니다. 일반적인 전치 연산 외에 perm=[...]에 원하는 순서대로 차원을 지정하여 바꿀 수 있습니다. 

T6 = tf.transpose(T5, perm=[2,1,0])
print(T6)
T7 = tf.transpose(T5, perm=[0,2,1])
print(T7)

 

tf.split함수를 사용하여 다음과 같이 텐서를 작은 텐서의 리스트로 나눌 수도 있습니다

t5_split = tf.split(T5, num_or_size_splits=2, axis=2)
print(t5_split)

출력 결과는 더 이상 하나의 텐서가 아니라 텐서의 리스트입니다.

 

마지막으로 또 다른 유용한 변환은 텐서 연결입니다. 크기와 dtype이 같은 텐서 리스트가 있다면 tf.concat함수로 연결하여 하나의 큰 텐서를 만들 수 있습니다.

t1 = tf.ones(shape=(5,1), dtype=tf.float32)
t2 = tf.zeros(shape=(5,1), dtype=tf.float32)
print(t1)
print(t2)

t3 = tf.concat([t1,t2], axis=0)
print(t3)
t4 = tf.concat([t1,t2], axis=1)
print(t4)

 

반응형