본문으로 바로가기



Tensorflow + R - 2. placeholder와 노드(node) 개념 이해

category R Programming/TensoRflow 2017.07.23 19:22
Tensorflow + R - 2. placeholder와 노드(node) 개념 이해

본 텐서플로우 시리즈는 Sung Kim 교수님의 유튜브 강의(python 기반, 참고자료의 링크)를 기반으로 필자가 R 버전에 맞도록 코드를 수정 및 변형 시켰음을 알려드립니다.


library(tensorflow)

Hello, Tensorflow

저번 포스팅에서 우리는 Tensorflow상에 상수를 선언하는 방법에 대하여 알아보았다. 오늘은 텐서플로우에서 그래프의 개념과 Placeholder의 개념에 대하여 알아보도록 하겠다. 먼저, 아래의 코드와 같이 문자열을 텐서플로우 상에 정의해보도록 하자.

# Say hello to your tensorflow
hello <- tf$constant("Hello, Tensorflow")
hello
## Tensor("Const_7:0", shape=(), dtype=string)

위의 코드의 결과를 살펴보자. hello를 쳤을 때 우리가 입력한 “Hello, Tensorflow”가 보일 것이라고 생각했던 독자들은 약간 당황할 수 있다. 이러한 일이 벌어지는 이유는 엄밀히 말하면 텐서플로우는 R과는 완벽히 분리된 하나의 프로그래밍 언어이기 때문이다. 이러한 상황은 우리에게 다음의 장정과 단점을 가져다 준다.

  • 단점: 앞에서 관찰할 수 있다시피 텐서플로우 상에 정의된 객채를 R에서 바로 확인 할 수가 없다. 물론 Interactive Session을 통하여 확인 할 수 있지만, 이것도 여간 짜증나는게 아니다.
  • 장점: 완벽히 분리된 텐서플로우는 R의 계산 엔진을 사용하지 않고 독립된 라이브러리를 사용한다. 또한 GPU가 연결되어 있는 텐서플로우의 경우는 그래픽 카드를 이용한 계산에 이미 최적화된 라이브러리를 가지고 있기 때문에 계산 속도에 있어서 그냥 R을 이용하는 경우와 비교하여 훨씬 빠르다. 이것은 마치 엑셀과 VBA의 관계라고 생각할 수 있을 것이다.

단점에서 언급한 것과 같이 텐서플로우 상에 정의된 객체의 값을 R로 불러오는 일을 다음과 같이 Session()을 열어서 확인 할 수 있다. 여기서 주의할 점은 세션을 한번 열고 계산을 한 뒤에는 꼭 세션을 닫아줘야 한다는 것이다. 세션을 계속 열기만 하고 닫지 않는 경우에는 텐서플로우 상에 세션이 계속 중첩되어 열리게 되고 결국에는 에러가 난다.

sess <- tf$Session()
sess$run(hello)
## [1] "Hello, Tensorflow"
sess$close()

그래프의 개념

텐서플로우는 프로그램의 계산 과정을 컴퓨터 공학에서 사용하는 그래프 개념을 채택하여 계산하고 있다. (수학시간에 배우는 그래프가 아니다.) 그래프는 아래의 그림에서와 같이 파란색 원이 의미하는 node와 화살표가 의미하는 vertices들로 이루어져 있다. 우리가 앞에서 “Hello, Tensorflow”라는 스트링을 hello라는 변수에 정의하였는데, 텐서플로우는 이러한 과정을 가상의 공간에 hello라는 파란원을 하나 만들었다고 생각하는 것이다.

그래프의 예

그래프의 예

node 정의와 계산

앞에서 말한 내용을 생각하면서 다음의 코드를 살펴보자.

# Add number node
node1 <- tf$constant(3.0)
node2 <- tf$constant(5.0)
node3 <- tf$add(node1, node2)

node1과 node2의 경우는 각각 3과 5를 담고있는 constant 노드이다. 그리고 node3의 경우는 node1과 node2의 값을 더하는 node이다. 여기서 중요한 점은 덧셈 연산이 하나의 노드라는 점이다. 위의 코드를 앞에서 살펴본 그림으로 나타내어 보면 다음과 같은 방향성이 있는 그래프(directed graph) 일 것이다.

node1,2,3간 관계

이렇게 가상의 공간에 정의되어진 그래프들은 우리가 세션을 열기 전까지는 계산이 되지 않는다. 즉, 가상의 공간에 우리가 계산을 어떻게 할 것인지를 모두 정의한 후 세션을 열어서 계산을 시키는 것이다.

# before Session is opened
node3
## Tensor("Add_3:0", shape=(), dtype=float32)
# after Session is opened
sess <- tf$Session()
sess$run(node3)
## [1] 8
sess$close()

Placeholder

필자는 처음 텐서플로우를 배우면서 용어가 생소하여 힘들었는데, 일단 이해를 하고 나면 결국 텐서플로우도 결국 프로그래밍 언어의 하나라서 기존에 다른 언어에서 배웠던 개념과 연결시켜 이해할 수 있다. Placeholder는 일반 프로그래밍 언어에서의 변수 선언과 비슷하다.

a <- tf$placeholder(tf$float32)
b <- tf$placeholder(tf$float32)
c <- tf$add(a, b)

앞에서 본 상수 node의 경우, 파란색 원 안에 정의할 때 부여된 초기값이 들어가 있다고 생각할 수 있다. Placeholder 명령어는 빈 원을 생성 시킬 수 있다고 생각하면 된다. 이렇게 생성한 변수 노드들에 feed_dict함수를 사용하여 세션을 시작하면서 초기값을 부여할 수 있다.

sess <- tf$Session()
sess$run(c, feed_dict = dict(a = 3, b = 4))
## [1] 7
sess$run(c, feed_dict = dict(a = c(1:10), b = c(21:30)))
##  [1] 22 24 26 28 30 32 34 36 38 40
sess$run(c, feed_dict = dict(a = matrix(1:10, ncol=3), b = matrix(21:30, ncol=3)))
##      [,1] [,2] [,3]
## [1,]   22   30   38
## [2,]   24   32   40
## [3,]   26   34   22
## [4,]   28   36   24
sess$close()

위의 두 번째 코드에서 볼 수 있다시피, Placeholder가 기존의 변수와 다른 점은 Placeholder에는 값을 하나만 담을 수 있는 것이 아니라, 그것과 연결된 상위노드의 연산에 위배되지 않는 한 다양한 값을 담을 수 있다는 사실을 이해하도록 하자.

참고자료

[1] Rstudio - tensorflow website

[2] 모두를 위한 딥러닝 강의(ML-lab-01): https://youtu.be/-57Ne86Ia8w?list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm


SHARE TO



티스토리 툴바