프로그래밍/TensorFlow

텐서플로우(TensorFlow) 기초 - 자료형

엠얼록 2017. 3. 1. 21:39


텐서플로우는 3개의 자료형을 가지고 있습니다.


1. placeholder

2. Variable

3. constant


간단하게 알아보자면, 우리가 흔히 사용하는 프로그래밍언어에서의 변수는 Variable이고 const 붙은 상수는 constant와 매칭이됩니다.

그러면 남는게 placeholder인데, 이 녀석은 개념이 조금 틀립니다.

이미 a라는 변수에 데이터(들)이 들어있고, 그 변수를 placeholder형의 변수에 맵핑을 시킨다고 보시면 됩니다.


placeholder에 대해서는 다음챕터에서 좀 더 자세하게 테스트 해볼 것이기 때문에, 오늘은 Variable와 constant 두 개를 연습해 볼 것 입니다.





Variable


기존 프로그래밍을 좀 해보셨던 분들은 매우 익숙한 단어 입니다.

흔히 다른 언어에서 사용하는 변수와 같은 개념으로 보시면 됩니다.

'초기화를 할 수 있고, 값을 변경 할 수 있다.' 이런 정도의 개념이 되겠죠.

텐서플로우에서 정의하고 있는 변수는 아래와 같습니다.


모델을 학습 시킬 때, 매개 변수(parameter) 업데이트와 유지를 위해 변수(Variables)를 사용합니다.

변수는 텐서를 포함하는 인-메모리 버퍼입니다. 변수는 반드시 명시적으로 초기화해야 합니다.

그리고 학습 중 혹은 학습 후에 디스크에 저장할 수 있습니다. 저장된 값들을 모델 실행이나 분석을 위해 나중에 복원할 수도 있습니다.


뭔가 복잡한 내용처럼 보이지만, 일반적인 변수로 생각하시면 머리가 좀 편안해 집니다.


자 그럼 변수 선언과 간단한 사용법을 알아보겠습니다.


공식 홈페이지의 API문서를 참고하셔도 도움이 많이 됩니다.

(https://www.tensorflow.org/api_docs/python/tf/Variable)


자 간단하게 아래와 같이 테스트를 해보겠습니다.


import tensorflow as tf

var1 = tf.Variable(1)
init_op = tf.global_variables_initializer()

sess = tf.Session()
sess.run(init_op)
res = sess.run(var1)

print(res)

그려면 결과가 1이 나올것입니다.


그런데 여기서 중요한 코드가 있습니다. 4번라인의 "tf.global_variables_initializer()" 함수입니다.

4번라인에서 만든 "init_op"를 run하기전에는 해당 변수의 값이 할당이 되지 않습니다. 그래서 4,7번라인을 빼고 실행을 하면 에러가 수두룩 올라갑니다.


모든 변수를 사용하기전에는 4번과 7번라인과 동일하게 호출을 해주어야 하며, 변수당 하나씩 할 필요 없이, 사용하기전 한번만 호출하면 됩니다.





constant


constant도 기존에 알고 계시던 계념과 동일합니다.

한번 지정해놓으면 변하지 않는 값입니다.

variable과 마찬가지로 배열도 값으로 할당이 가능합니다만, 우리는 아직 1도 모르는 초보자이기 때문에, 단순 값 하나만 넣어서 테스트 합니다.


import tensorflow as tf

var1 = tf.Variable(1)
sess = tf.Session()
res = sess.run(var1)

print(res)

결과는 위의 Variable와 같은 1이지만, variable에 있던 변수 초기화하는 코드가 없습니다. 또한 tf.assign함수를 이용해 값을 변경하려고 해봐도 오류가 날 것 입니다.





Sample Code


아래 코드는 variable와 const를 사용해서 구구단을 한번 만들어 보는 코드 입니다. 완전 코흘리개 코드이지만 지금 아는 지식에서는 모든걸 쏟아낸 코드 입니다. ㅎㅎ

import tensorflow as tf

class TestTF:

    @staticmethod
    def GuGuDan():
        nUnit = tf.constant(1)

        nDan = tf.Variable(1)
        nMul = tf.Variable(1)

        fnDanAdd = tf.add(nDan, nUnit)
        fnMulAdd = tf.add(nMul, nUnit)
        fnMul = tf.multiply(nDan, nMul)

        init_op = tf.global_variables_initializer()

        fnUpdateDan = tf.assign(nDan, fnDanAdd)
        fnUpdateMul = tf.assign(nMul, fnMulAdd)
        fnInitMul = tf.assign(nMul, 1)

        resArr = []

        with tf.Session() as sess:
            sess.run(init_op)
            for x in range(9):
                for y in range(9):
                    resValue = sess.run(fnMul)
                    resStr = "%d * %d = %d" % (sess.run(nDan), sess.run(nMul), resValue)

                    sess.run(fnMulAdd)
                    sess.run(fnUpdateMul)
                    resArr.append(resStr)

                sess.run(fnDanAdd)
                sess.run(fnUpdateDan)
                sess.run(fnInitMul)

        for x in resArr:
            print(x)

TestTF.GuGuDan()

완성입니다.


원리는 간단합니다. 구구단을 그래프화 시켜서 해당 그래프를 텐서로 구현한 것 뿐입니다.


이런식으로 혼자서 무엇인가 생각해서 만들어보면 기본자료형에 대한 이해는 어느정도 될 것이라고 봅니다.