본문 바로가기
ML & DL/tensorflow

TensorFlow 기본 동작 및 사용법

by 별준 2020. 11. 10.

- TensorFlow 2 기준 작성

tensorflow 공식 홈페이지를 참조하였습니다.

www.tensorflow.org/?hl=ko

 

TensorFlow

모두를 위한 엔드 투 엔드 오픈소스 머신러닝 플랫폼입니다. 도구, 라이브러리, 커뮤니티 리소스로 구성된 TensorFlow의 유연한 환경입니다.

www.tensorflow.org

 

1. TensorFlow

TensorFlow는 tensor라는 수학적 개념의 배열을 사용해서 계산하고 실행하는 프레임워크라고 할 수 있습니다. 텐서(tensor)는 벡터와 행렬을 일반화해서 나타내는 것이고, 고차원으로 확장이 가능합니다. 

TensorFlow 프로그램을 작성할 때, 기본적으로 tf.Tensor 객체를 조작하고 전달해서 연산을 수행하게 됩니다.

 

tf.Tensor는 다음과 같은 속성을 가지고 있습니다.

  • a single data type(float32, int32, or string, etc...)
  • a shape(차원)

텐서 안에서 각각의 원소는 모두 동일한 자료형을 가지고, shape는 그 텐서의 형태를 의미합니다. 대부분 형태가 완전하게 정의된 텐서를 만들지만, 일부 경우에 따라서는 graph를 실행한 이후에 형태를 알 수 있기도 합니다.

 

tensorflow 1에서는 computational graph를 위한 placeholder와 Variable를 준비하고, session을 정의해서 연산을 수행하지만, tensorflow 2에서는 즉시 실행하는 것이 기본 설정입니다.

즉, tensorflow 1에서는 placeholder, variable, loss function 등을 define하는 과정에서는 아무것도 실행되지 않고, session을 정의하고 run해야만 연산이 실행되는 구조였습니다.(즉시 실행 모드로도 가능합니다)

이런 특징 때문에 '지연 실행'이라는 문제점이 있었고, 수십개의 layer를 쌓아올리는 neural network를 실행할 때, 초기에 computational graph를 구성하느라, 실행속도가 느린 현상이 있었다고 합니다. 

tensorflow 2에서는 선언 즉시 실행되는 eager execution mode가 default로 설정되어서 평상시에 파이썬을 사용하듯이 사용하게 됩니다.

 

나머지 변경되는 기능들은 사용하면서 다시 익히도록 하고, 이번 글에서는 텐서플로우의 기본적인 사용과 연산을 실행해보도록 하겠습니다.

 

1. Hello World 출력

먼저 tensorflow를 import하고, 'hello world'라는 값을 담고 있는 텐서 상수를 정의해보겠습니다.

import tensorflow as tf

hello = tf.constant('hello world')

그리고 hello를 print하면, 

print(hello)
# output : tf.Tensor(b'hello world', shape=(), dtype=string)

tf.Tensor(b'hello world', shape=(), dtype=string) 라는 hello라는 텐서 객체의 정보가 나타나게 됩니다.

우리가 원하는 것은 hello의 value인데, value를 출력하기 위해서는 .numpy() 메소드를 사용하면 됩니다.

print(hello.numpy())
# output : b'hello world

 

2. 기본 연산

c1 = tf.constant(7)
c2 = tf.constant(9)

이번에는 숫자(int32)형인 상수를 정의하고, 사칙연산을 수행해보겠습니다.

텐서플로우에는 add(), subtract(), multiply(), divide() 메소드를 사용해서 연산이 가능합니다.

tfAdd = tf.add(c1, c2)      # c1 + c2
tfSub = tf.subtract(c1, c2) # c1 - c2
tfMul = tf.multiply(c1, c2) # c1 * c2
tfDiv = tf.divide(c1, c2)   # c1 / c2

각각의 결과는 해당 연산을 수행한 결과 값을 담고있는 텐서가 됩니다.

그리고, 아래와 같이 연산을 수행할 수도 있습니다.

add = c1 + c2
sub = c1 - c2
mul = c1 * c2
div = c1 / c2

결과는 텐서플로우 메소드를 사용한 것과 동일합니다.

 

텐서들의 평균과 합을 구하는 메소드도 존재합니다.

c3 = tf.constant(10)

mean = tf.reduce_mean([c1,c2,c3])
sum = tf.reduce_sum([c1,c2,c3])

print('mean = ', mean.numpy())	# 8
print('sum = ', sum.numpy())	# 26

 

3. 행렬 연산

2차원 행렬 텐서를 만들어서 연산도 가능합니다.

mat1 = tf.constant([[1, 2], [3, 4]])
mat2 = tf.constant([[5, 6], [7, 8]])

print('mat1 = ', mat1.numpy())
print('mat2 = ', mat2.numpy())

간단히 살펴보면, 행렬끼리의 곱은 matmul() 메소드로 연산이 가능합니다.

product = tf.matmul(mat1, mat2)
print(product)
# <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
# array([[19, 22],
#       [43, 50]], dtype=int32)>

그리고, 만약 요소끼리의 곱 연산이 필요하면, 숫자 곱셈 연산처럼 실행하면 결과를 얻을 수 있습니다.

element_product1 = mat1 * mat2
element_product2 = tf.multiply(mat1, mat2)
# <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
# array([[ 5., 12.],
#        [21., 32.]], dtype=float32)>

 

기본적인 연산은 위와 같이 진행할 수 있습니다. 

(이 정도만 알아도 충분할 거 같긴한데...., 더 필요한 API는 공식홈페이지 참조바랍니다 !)

댓글