TensorFlow를 사용하기 위해서는 TensorFlow가 어떻게 다음과 같은 일을 수행하는지 이해해야 합니다:
- 어떻게 계산을 그래프화하는가.
- 어떻게 세션(
Session
)에서 그래프를 실행하는가. - 어떻게 데이터를 텐서로 표현하는가.
- 어떻게 변수(
Variable
)로 상태를 관리하는가. - 어떻게 임의의 연산(operations)으로부터 데이터를 얻거나 저장하기 위해 피드(feed)와 페치(fetch)를 사용하는가.
개요
TensorFlow는 계산(computation)을 그래프(graph)로 표현하는 프로그래밍 시스템입니다. 그래프의 노드(node)는 연산(ops, operations의 줄임)이라고 부릅니다. 하나의 연산은 0개 이상의 Tensor
를 취해 어떤 계산을 한 뒤 0개 이상의 Tensor
를 다시 반환합니다. Tensor
는 형태를 가진 다차원 배열이라고 할 수 있습니다. 예를 들어, 여러 개의 이미지를 실수(floating point number)로 이루어진 4-D 배열([이미지, 높이, 너비, 채널]) 형태로 표현해볼 수 있을 것입니다.
TensorFlow에서 그래프는 계산을 기술한 것입니다. 어떤 것이든 계산하기 위해서는 반드시 그래프를 Session
에 올려야 합니다. Session
은 CPU나 GPU 같은 Devices
에 그래프 연산을 올린 뒤 연산을 실행할 수 있는 메소드를 제공합니다. 이 메소드는 연산에 의해 생성된 텐서를 반환하는데, 이 텐서의 형태는 파이썬에서는 numpy의 ndarray
객체, C와 C++에서는 tensor flow::Tensor
개체입니다.
계산 그래프(computation graph)
TensorFlow 프로그램은 크게 두 가지 단계로 구성되어 있습니다. 구성(construction) 단계에서는 그래프를 조립(assemble)하고, 실행(execution) 단계에서는 세션을 이용해 그래프의 연산을 실행합니다.
예를 들어, 구성 단계에서 신경망을 나타내고 훈련할 수 있는 그래프를 생성하고, 실행 단계에서 반복적으로 그래프의 훈련 연산을 실행하는 식의 진행은 흔합니다.
TensorFlow는 C, C++, 파이썬 프로그램에서 사용할 수 있습니다. 아직까지는 파이썬 라이브러리를 사용하는 편이 그래프를 조립하기에 훨씬 용이합니다. C나 C++ 라이브러리가 제공하지 않는 방대한 도움 함수를 사용할 수 있기 때문입니다.
세션 라이브러리는 세 언어에서 같은 수준의 기능을 제공합니다.
그래프 만들기
그래프를 만들기 위해서는 Constant
와 같이 어떤 입력도 필요로 하지 않는 연산(소스 연산)으로 시작하십시오. 그리고 그 출력을 계산을 수행하는 다른 연산에 넘겨줍니다.
파이썬 라이브러리의 연산 생성자(ops constructor)는 생성된 연산의 출력을 나타내는 객체를 반환합니다. 우리는 이 객체를 다른 연산 생성자의 입력으로 넘겨줄 수 있습니다.
TensorFlow 파이썬 라이브러리는 기본 그래프를 가지고 있는데, 연산 생성자가 이 그래프에 노드를 추가합니다. 대부분의 경우에는 기본 그래프를 쓰는 것으로 충분합니다. 여러 개의 그래프를 관리하는 법이 궁금하다면 Graph
클래스 문서를 참고하십시오.
기본 그래프는 이제 두 개의 constant()
연산과 하나의 matmul()
연산을 합해, 총 세 개의 노드를 가지게 되었습니다. 실제로 행렬을 곱해서 결과를 얻으려면 세션에 그래프를 올려야 합니다.
그래프를 세션에 올리기
그래프를 세션에 올리려면 먼저 Session
객체를 만들어야 합니다. 아무런 인자를 넘기지 않으면 세션 생성자는 기본 그래프를 사용하게 됩니다.
세션 API가 궁금하다면 Session
클래스 문서를 참고하세요.
자원을 시스템에 돌려주려면 세션을 닫아야 합니다. "with" 블록을 이용해서 Session
에 들어갈 수도 있습니다. 이 경우 with
블록이 끝나면 Session
이 자동으로 닫히게 됩니다.
TensorFlow로 구현하면 그래프 정의를 실행 가능한 연산으로 바꾸어 가용한 컴퓨터 자원(CPU, GPU 등)에 분배합니다. 일반적으로 CPU나 GPU를 구체적으로 지정할 필요는 없습니다. 여러분의 시스템에 GPU가 하나 있다면, TensorFlow는 GPU에 가능한 많은 연산을 넘겨줍니다.
만약 두 개 이상의 GPU가 있다면 명시적으로 정해 줄 필요가 있습니다. with...Device
구문을 사용해서 연산에 어떤 CPU 혹은 GPU를 사용할 것인지 지정할 수 있습니다:
장치는 문자열로 나타냅니다. 현재 지원되는 장치는:
- "/cpu:0": 여러분 컴퓨터의 CPU.
- "/gpu:0": 여러분 컴퓨터의 첫 번째 GPU.
- "/gpu:1": 여러분 컴퓨터의 두 번째 GPU, 등등.
GPU와 TensorFlow에 대한 더 자세한 사항은 GPU 사용하기 문서를 참고하십시오.
대화형으로 사용(Interactive Usage)
이 문서에서 본 파이썬 예제에서는 그래프를 Session
에 올린 뒤 Session.run()
메소드를 이용해 연산을 실행했습니다.
IPython과 같은 대화형 파이썬 환경에서 보다 쉽게 사용하려면,InteractiveSession
클래스를 통해 Tensor.eval()
과 Operation.run()
메소드를 호출할 수도 있습니다. 그러면 세션을 위해 변수를 미리 생성할 필요가 없습니다.
텐서
TensorFlow 프로그램은 텐서(tensor) 데이터 구조를 사용해서 모든 데이터를 나타냅니다. 계산 그래프에서 연산을 할 때에도 오직 텐서만 주고 받습니다. TensorFlow의 텐서는 n 차원의 배열이나 리스트라고 생각하면 됩니다. 텐서는 정적 타입(static type), 랭크(rank), 모양(shape)의 속성을 가집니다. TensorFlow가 어떻게 이 개념들을 다루는지 알고 싶다면 Rank, Shape, and Type 문서를 참고하십시오.
변수
변수는 그래프가 실행되는 동안 어떤 상태를 담고 있습니다. 다음 예제는 간단한 계수 역할을 하는 변수를 보여주고 있습니다. 더 자세한 사항은 Variables를 참고하세요.
이 코드에 등장한 assign()
연산은 add()
연산과 마찬가지로 표현 그래프(expression graph)의 일종입니다. 그래서 run()으로 그 표현을 실행하기 전에는 실제 대입 연산을 수행하지 않습니다.
일반적으로 통계 모델의 파라미터를 변수로 나타냅니다. 예를 들어, 신경망의 가중치(weight)를 텐서 변수에 저장할 수 있습니다. 훈련 과정이 진행되면 훈련 그래프를 반복적으로 실행해서 이 텐서를 갱신하게 됩니다.
가져오기(Fetches)
연산의 출력을 가져오기 위해서는 Session
객체에서 가져오고 싶은 텐서를 run()
에 인자로 넘겨서 그래프를 실행해야 합니다. 이전 예제에서 우리는 state
라는 한 개의 노드를 가져왔지요. 하지만 여러 개의 텐서를 가져올 수도 있습니다:
요청된 텐서들의 출력값을 만드는 데 관여하는 모든 연산은 (요청된 텐서 하나 당 한 번이 아니라) 한 번만 실행됩니다.
피드(Feeds)
지금까지 본 예제에서는 텐서의 값을 Conatants
와 Variables
에 미리 저장한 뒤 계산 그래프에 넘겨줍니다. TensorFlow는 그래프 내에서 직접 텐서의 값을 할당할 수 있는 방법도 제공하고 있습니다.
피드(feed)는 연산의 출력을 지정한 텐서 값으로 임시 대체합니다. 임시로 사용할 피드 데이터는 run()
의 인자로 넘겨줄 수 있습니다. 피드 데이터는 run
을 호출할 때 명시적 인자로 넘겨질 때만 사용됩니다. 가장 흔한 사용법은 tf.placeholder()
를 사용해 특정 연산을 "피드" 연산으로 지정하는 것입니다.
placeholder()
연산은 피드 데이터를 제공하지 않으면 오류를 일으킵니다. 더 큰 규모의 피드 예제를 보고 싶다면 MNIST fully-connected feed tutorial (소스코드)을 참고하십시오.
토론이 없습니다