본문으로 바로가기



Tensorflow + R - 1. 상수(Constant) 선언하기

category R Programming/TensoRflow 2017.06.05 21:57
tensoRflow


오늘은 텐서플로우에서 변수를 선언하는 방법에 대하여 알아보도록 하겠다. 시작하기 앞서 텐서플로우와 파이프 연산자(%>%)를 사용하기 위하여 다음과 같이 팩키지를 불러오도록 하자.

library(tensorflow)
library(magrittr)

텐서플로우는 두가지 세션 모드를 제공하는데, 하나는 일반 세션모드이고, 다른 하나는 InteractiveSession이다. 인터렉티브 세션의 경우 우리가 프로그래밍을 하는 중간중간 결과 값을 확인 할 수 있게 해주는 개발자 친숙 모드라고 생각하면 쉽다. InteractiveSession을 시작하는 방법은 다음과 같다.

sess <- tf$InteractiveSession()

상수(Constant) 선언

먼저 상수를 선언하는 방법에 대하여 알아보자. 다음의 세 행렬은 각기 다른 타입으로 선언된 상수 행렬이다.

matrix1 <- tf$constant(matrix(c(1:6), ncol = 2))
matrix2 <- tf$constant(matrix(c(1:6), ncol = 2), dtype = "float32")
matrix3 <- tf$constant(matrix(as.numeric(c(1:6)), ncol = 2))

R의 경우, 동적 타입 프로그래밍 언어에 속하기 때문에 사실 사용자의 대부분이 변수가 어떤 타입인가에 대하여 별로 생각을 하지 않고 프로그래밍을 하는게 대부분이다.

하지만 python의 경우는 R과는 달리 그 변수가 어떤 타입(예를 들어 위와 같이 정수형 혹은 실수형 타입)인지에 따라서 값을 넣을 수 있는 경우가 있고, 에러가 나는 경우가 있다.

결과값 확인

앞에서 선언한 변수들의 타입을 확인해보자.

matrix1   # int32
## Tensor("Const:0", shape=(3, 2), dtype=int32)
##  int [1:3, 1:2] 1 2 3 4 5 6
## 
matrix2   # float32
## Tensor("Const_1:0", shape=(3, 2), dtype=float32)
##  num [1:3, 1:2] 1 2 3 4 5 6
## 
matrix3   # float64
## Tensor("Const_2:0", shape=(3, 2), dtype=float64)
##  num [1:3, 1:2] 1 2 3 4 5 6
## 

위의 결과에서 우리는 몇가지 R에 대한 깨알 지식들을 얻을 수가 있는데, 첫번째는 R의 기본 정수형 타입은 int32를 사용한다는 것이다. 두번째는 Rnumeric은 다른 언어(여기서는 python)에서의 float64 실수형 타입에 대응된다는 것이다.

결과값 해석

좀 더 자세히 결과값을 해석해보자. 두번째 결과값인 matrix2의 경우 텐서플로우는 다음과 같이 matrix2의 정보를 가지고 있다고 생각할 수 있다.

Tensor("Const_1:0", shape=(3, 2), dtype=float32)

matrix2는 먼저 텐서(Tensor)이며, 두번째로 정의된 constant 오브젝트이다. 두번째는 정의되었다는 것은 _1 부분에서 알 수 있는데 파이썬의 경우 첫 시작값이 0이므로 1은 두번째로 정의가 되었다는 것을 나타낸다.

:기호 위에 0의 의미는 반환값이 한개라는 뜻이다. 이것 역시 파이썬의 시작 번호 0에 따른 해석이다. 그 다음에 오는 shapematrix2라는 오브젝트가 3행 2열의 형태를 띄고 있다는 것을 의미한다. 마지막은 앞에서 언급한 것처럼 변수의 타입을 의미하는 부분이다.

필자의 값과 다르게 const_10과 같이 큰 숫자가 나온다면, 그것은 이전에 정의했던 그래프들이 아직 시스템 상에 남아있기 때문이다. 이것은 다음의 코드를 사용하여 텐서플로우 상의 그래프를 리셋해주면 된다.

# 그래프 리셋방법
tf$reset_default_graph()

R 상에서의 값 확인

포스팅의 시작부분에서 언급했던 InteractiveSession을 이용할 경우 우리가 정의한 텐서플로우 오브젝트 뒤에 eval() 함수를 붙이면 R상에서 값들을 확인할 수 있다. (일반적인 Session을 이용할 경우 초기화를 시켜주기 전까지는 이 기능이 작동되지 않는다.)

matrix1$eval()
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
matrix2$eval()
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
matrix3$eval()
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6

위의 결과값을 보면 다 똑같이 3행 2열의 정수형 행렬인 것처럼 보인다. 하지만 다음 코드의 결과를 확인해 보면 matrix1의 경우는 우리가 앞에서 정의한 것처럼 정수형 행렬이고, 나머지 matrix2matrix3의 경우는 numeric 타입이라는 것을 확인 할 수 있다. 마지막으로 열었던 세션을 닫아줌으로써 R과 텐서플로우의 연결을 끊어준다.

# Close session
sess$close()

참고자료

[1] Sung Kim 교수님 강의 - tensorflow ML-lab-08


SHARE TO



티스토리 툴바