텐서플로우 자료구조

일반 상대성이론(general relativity) 전문가인 "Lillian Lieber"는 텐서(tensor)를 "Facts of the Universe"라고 지칭했다. 구글브레인(google brain)에서 그래프기반 수치연산(Graph-based Numerical Computation)을 위한 오픈소스 라이브러리로 텐서플로우(tensorflow)를 공개했으며 2019년 Tensorflow 2.0를 공개하였는데 Eager Execution, 케라드, Estimators이 추가되었다.

텐서는 벡터와 행렬을 일반화한 것으로 숫자의 집합이라고 볼 수 있다. 행렬은 2-D 격자위에 놓은 숫자 집합으로 간주할 수 있는 반면 텐서(tensor) 는 일반화된 행렬로 생각할 수 있다.

텐서

텐서플로우 도구로 텐서 정의

텐서 정의

In [1]:
from __future__ import absolute_import, division, print_function
import tensorflow as tf

tf_0d = tf.ones((1,))
tf_0d
Out[1]:
<tf.Tensor 'ones:0' shape=(1,) dtype=float32>
In [2]:
tf_1d = tf.ones((2,))
tf_1d
Out[2]:
<tf.Tensor 'ones_1:0' shape=(2,) dtype=float32>
In [3]:
tf_2d = tf.ones((2,2))
tf_2d
Out[3]:
<tf.Tensor 'ones_2:0' shape=(2, 2) dtype=float32>
In [4]:
tf_3d = tf.ones((2,2,2))
tf_3d
Out[4]:
<tf.Tensor 'ones_3:0' shape=(2, 2, 2) dtype=float32>

상수(constant) 정의

넘파이(numpy)와 마찬가지로 상수를 정의하는데 유용한 함수가 다수 지원된다.

연산자 사례
tf.constant() constant([1, 2, 3])
tf.zeros() zeros([2, 2])
tf.zeros_like() zeros_like(input_tensor)
tf.ones() ones([2, 2])
tf.ones_like() ones_like(input_tensor)
tf.fill() fill([3, 3], 7)
In [5]:
from tensorflow import constant

x = constant(3, shape=[2,3])
print(x)
Tensor("Const:0", shape=(2, 3), dtype=int32)
In [6]:
y = constant([1,2,3,4], shape=[2,2])
y
Out[6]:
<tf.Tensor 'Const_1:0' shape=(2, 2) dtype=int32>

변수(variable) 정의

In [7]:
# 변수 정의
x = tf.Variable([1, 2, 3, 4, 5, 6], dtype=tf.float32)
y = tf.Variable([1, 2, 3, 4, 5, 6], dtype=tf.int16)

# 상수, 회귀계수 정의
coef = tf.constant(5, tf.float32)
# 회귀계수와 X 곱
y_hat = tf.multiply(x, coef)
print(".numpy() 메서드는 텐서를 넘파이 배열로 변환합니다.")
# print(y_hat.numpy())
.numpy() 메서드는 텐서를 넘파이 배열로 변환합니다.
In [8]:
import time

def time_matmul(x):
  start = time.time()
  for loop in range(100):
    tf.matmul(x, x)

  result = time.time()-start
    
  print("10 loops: {:0.2f}ms".format(1000*result))


# CPU에서 강제실행합니다.
print("On CPU:")
with tf.device("CPU:0"):
  x = tf.random_uniform([1000, 1000])
  assert x.device.endswith("CPU:0")
  time_matmul(x)

# GPU #0가 이용가능시 GPU #0에서 강제실행합니다.
print("On GPU:")
if tf.test.is_gpu_available():
  with tf.device("GPU:0"): # 또는 GPU:1, GPU:2
    x = tf.random_uniform([1000, 1000])
    assert x.device.endswith("GPU:0")
    time_matmul(x)
On CPU:
10 loops: 56.00ms
On GPU:
10 loops: 52.50ms
In [9]:
print(tf.test.is_gpu_available(cuda_only=False, min_cuda_compute_capability=None))
True
In [10]:
tf.test.is_gpu_available()
Out[10]:
True
In [ ]: