TensorFlow의 개념 잡기 연습

TensorFlow의 개념

  • Data flow graph를 이용하여 산술계산을 위한 오픈 소스 소프트웨어 라이브러리로 파이썬을 통해 사용할 수 있다.


Tensor란?

  • 텐서(tensor) : \(n\)차원 행렬(matrix)

    • 2차원 텐서는 일반적인 \(2\times2\) 행렬이다.

Data Flow Graph

  • 점(node) : 그래프에서 수학 연산을 나타내며 선을 통해 입력받은 데이터를 연산하여 결과를 선으로 출력한다.
  • 선(edge) : 점들을 지나다니는 다차원 데이터 배열(multidimensional data array)로 텐서(tensor)라고 함
  • 데이터 흐름 그래프(data flow graph) : 데이터들이 점을 지나면서 연산이 이루어지고 결국에는 내가 원하는 결과를 얻거나 작업이 이루어지는 과정으로 텐서가 그래프 상에서 돌아다닌다., 즉 텐서 플로우(tensor flow)이다.



TensorFlow 실행

  • TensorFlow를 설치하고, 버전을 확인한다.
>>> import tensorflow as tf
>>> tf.__version__
'1.1.0-rc1'
  • Hello, TensorFlow!를 출력해보자.
    • constant() 함수를 사용해서 점만 1개 있는 그래프를 만든다.
    • 선은 없으며, 점에는 "Hello, TensorFlow!"라는 상수만 있는 연산 그래프이다.
    • 계산 그래프를 실행하기 위해서는
      1. 세션을 만든다.
      2. run() 함수를 사용하여 우리가 만들어 놓은 연산(점)을 실행한다.
      • 결과에서 'Hello, TensorFlow!' 문자열 앞에 있는 b는 바이트 문자열(Bytes literals)을 의미한다.
# constant() 함수로 상수만 있는 연산을 하나 만든다.
# 이 연산은 기본 텐서플로우 그래프에 점(node)으로 추가가 된다.
>>> hello = tf.constant("Hello, TensorFlow!")

# 텐서플로우 세션을 시작한다.
>>> sess = tf.Session()

# 연산을 수행하고 결과를 얻는다.
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
  • 2개의 데이터를 받아 더하는 그래프를 만들어보자.
    • 다음과 같이 a와 b의 값을 더하는 그래프를 만드는 것이다.
    • 오른쪽 그림과 같이 텐서 3과 텐서 4가 선을 따라 이동하여 더하기 연산을 통하여 덧셈 결과값 텐서를 만들어 내는 것이다.

    1. 2개의 입력을 위하여 constant() 함수로 데이터 입력용 연산을 위한 점을 만든다.
    2. 더하기 연산을 위하여 add() 함수로 더하기 연산 점을 만든다.
    3. 세션을 만든다.
    4. run() 함수로 그래프 연산을 한다.
>>> node1 = tf.constant(3.0, tf.float32)
>>> node2 = tf.constant(4.0)  # 암묵적으로 tf.float32로 인식한다.
>>> node3 = tf.add(node1, node2) 

>>> print("점1 = ", node1, "점2 = ", node2)
점1 =  Tensor("Const_4:0", shape=(), dtype=float32) 점2 =  Tensor("Const_5:0", shape=(), dtype=float32)
# 점1과 점2는 모두 Tensor이다!!!

>>> print("점3 = ", node3)
점3 =  Tensor("Add:0", shape=(), dtype=float32)
# 점3도 Tensor이다!!!
>>> sess = tf.Session()

>>> print("sess.run(점1, 점2) = ", sess.run([node1, node2]))
sess.run(점1, 점2) =  [3.0, 4.0]

>>> print("sess.run(점3) = ", sess.run(node3))
sess.run(점3) =  7.0

>>> node4 = node1 + node2   # 'node4 = node1 + node2'라고 해도 된다.
>>> print("sess.run(점4) = ", sess.run(node4))
sess.run(점4) =  7.0

 

TensorFlow의 역학구조

  1. TensorFlow의 연산을 사용하여 그래프를 만든다.
  2. Session() 함수로 세션을 만들고, sess.run() 함수에 데이터를 주고 계산 그래프를 실행하여 연산을 한다.
  3. 결과값이 나와 그래프에 있는 변수들이 업데이트 된다.


TensorFlow에서 변수의 값을 바꾸어 보자.

  • 그래프를 미리 만들어 놓고, 실행하는 단계에서 값을 주고 싶다.
  • placeholder() 함수로 점을 만들어 놓으면 된다.
    1. placeholder() 함수로 변수형 점을 만든다.
    2. run() 함수로 그래프를 실행할 때, feed_dict 변수로 데이터를 입력한다.
>>> a = tf.placeholder(tf.float32)
>>> b = tf.placeholder(tf.float32)
>>> adder_node = a + b

>>> print(sess.run(adder_node, feed_dict = {a: 3, b: 4.5}))
7.5

>>> print(sess.run(adder_node, feed_dict = {a: [1, 3], b: [2, 4]}))
[ 3.  7.]



Tensor란 무엇인가?

  • 텐서는 배열(array)로서 어떤 값이든 될 수 있다.

  • 텐서를 얘기할 때에는 랭크(Rank)와 모양(Shape), 종류(Type)를 사용한다.
    • 랭크 : 몇 차원 배열인가?

    • 모양 : 각각의 원소에 몇 개가 들어있는가?
      • 텐서를 설계할 때 매우 중요하기 때문에 몇 개의 원소를 가지고 있는지 잘 살펴봐야 한다.
      • 텐서의 모양은 파이썬 리스트일 수도 있고, 정수들의 정렬된 집합을 포함하는 튜플(tuple)일 수도 있다.
      • 차원의 개수만큼 숫자들이 리스트 안에 있을 수 있는데, 리스트 안의 각 숫자는 각 차원의 숫자를 의미
        • 각 차원의 값을 None으로 지정하면 길이는 변할 수 있다.
        • tf.shape() 연산으로 모양을 확인할 수 있음

    • 종류 : 데이터의 종류
      • 대부분의 경우 float32를 사용


    • 연산(OP; operation) : 텐서 객체에(또는 텐서 객체를 사용하여) 계산을 수행하는 점(node)이다.
      • 0개 이상의 입력을 받아 0개 이상의 텐서를 반환
      • 입력과 출력이 모두 0개인 연산
        • 텐서플로우에서 연산은 단순한 수학적인 계산 이상으로 상태를 초기화하는 등과 같은 일에 사용됨
        • 모든 점들이 다른 점들과 반드시 연결될 필요는 없음
      • 연산의 생성자는 문자열 매개변수인 name을 입력을 받아들임
        • name 매개변수를 사용하여 문자열로 특정 연산을 참조할 수 있음
        • c = tf.add(a, b, name = 'add_c')
          


+ Recent posts