텐서플로우

텐서플로우(TensorFlow)는 구글이 개발한 오픈소스 기계 학습 라이브러리이다. 아파치 라이선스를 적용받는다.

C++로 작성되었으며, 파이썬 바인딩 버전이 많이 사용되고 있다. 다른 프로그래밍 언어로의 포팅 또한 활발하다. CPU-only 버전과 GPU 버전이 모두 배포되고 있다. CPU 연산과 GPU 연산을 코드 수정 없이 할 수 있다는 것은 매우 큰 장점. GPU 버전은 CUDA를 이용하므로 NVIDIA 그래픽카드가 장착되어 있지 않은 경우 사용할 수 없다. OpenCL 버전이 개발되고 있다고 한다.

구글의 기계학습 전용 프로세서인 TPU(텐서 프로세싱 유닛)를 위한 버전도 존재한다. 구글은 TPU를 클라우드 서비스로 제공하고 있다.

튜토리얼[편집 | 원본 편집]

이하는 Python3을 이용하여 작성되었다.

텐서[편집 | 원본 편집]

텐서벡터, 행렬등을 일반화한 것으로, 기본 데이터타입(float32, int32, string 등)의 n차원 배열을 말한다.

  • 랭크 0인 텐서는 흔히 스칼라라고 부르며, 크기만 있는 값을 나타낸다.
  • 랭크 1인 텐서는 벡터라고도 하며, 스칼라를 일렬로 늘어놓은 것을 말한다.
  • 랭크 2인 텐서는 행렬로, 스칼라를 사각형 모양으로 쌓아놓은 것이다.
  • 랭크 3은 스칼라를 직육면체 모양으로 쌓아놓은 것으로 생각할 수 있다.

상수, 변수, 플레이스홀더[편집 | 원본 편집]

상수는 변하지 않는 값을 나타내는 텐서로,

constant = tf.constant([1, 2, 3])

와 같이 정의한다.

변수는 연산을 실행하는 중에 변할 수 있는 텐서이다.

my_variable = tf.get_variable("my_variable", shape=(3,), initializer=tf.constant_initializer([1, 2, 3]))

와 같이 정의할 수 있다.

my_variable = tf.Variable([1, 2, 3])

과 같은 방식도 가능하나, 앞의 것이 권장되는 방법이다. 모두 [1, 2, 3]의 초깃값을 가지는 변수를 생성한다.

플레이스홀더(Placeholder)는 사용자가 값을 제공해줘야 하는 텐서이다. 입력 데이터, 레이블 데이터 등을 나타내기 위해 사용한다.

p = tf.placeholder(tf.float32)

와 같이 정의한다.

데이터플로우 그래프와 세션[편집 | 원본 편집]

데이터플로우 그래프

텐서플로우는 연산을 바로 실행하는 것이 아니라, 연산 과정을 유향 그래프로 표현하여 저장한다. 이를 데이터플로우 그래프라고 부른다.

다음 코드를 보자.

import tensorflow as tf
a = tf.constant(2)
b = tf.constant(3)
c = tf.constant(4)
d = a * b + c
print(d) # Tensor("add:0", shape=(), dtype=int32)

d를 출력한 결과값이 10이 아닌 다른 객체임을 알 수 있다.

a * b + c는 a값과 b값을 곱하고, c를 더하라는 연산을 나타내는 그래프를 생성한다. 이 연산을 실제로 수행하려면 세션을 이용해야 한다.

import tensorflow as tf
a = tf.constant(2)
b = tf.constant(3)
c = tf.constant(4)
d = a * b + c
with tf.Session() as sess:
    result = sess.run(d)
    print(result) # 10

이처럼 그래프를 이용하여 얻을 수 있는 이점은 다음과 같다.

  • 병렬 연산의 용이성
    각 연산간의 의존성이 그래프의 변으로 잘 나타나기 때문에 어떤 연산들이 동시에 실행될 수 있는지 분석하기 쉬워진다.
  • 분산 처리 가능
    위와 마찬가지로, 여러 분산되어 있는 기기에서 연산을 분담하는 것도 가능하다.
  • 최적화 용이
    텐서플로우의 XLA 컴파일러는 이 그래프를 분석하여 인접한 연산을 통합하는 등, 더 빠른 코드를 생성해낼 수 있다.
  • 이식가능성
    그래프를 언어에 독립적인 표현으로 저장할 수 있다. 파이썬으로 편하게 작성한 연산을 저장해서, 속도가 빠른 C++에서 불러다 쓸 수 있다는 것이다.

플레이스홀더에 값을 넣기 위해서는 sess.run에 feed_dict 인자를 준다. 변수는 초기화해야 사용할 수 있다.

import tensorflow as tf
a = tf.constant(2)
b = tf.placeholder(tf.int32, shape=())
c = tf.get_variable("c", dtype=tf.int32, shape=(), initializer=tf.constant_initializer(4))
d = a * b + c
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer()) # 변수를 초기화한다.
    result = sess.run(d, feed_dict={b: 3}) # b에 3을 넣고 그래프를 실행한다.
    print(result) # 10

관련 사이트[편집 | 원본 편집]

각주