아무거나

TensorFlow 설치 및 사용 본문

AI or APP/Tensorflow

TensorFlow 설치 및 사용

전봉근 2018. 6. 22. 18:32
반응형



TensorFlow란? 구글에서 만든 오픈소스 라이브러리이다. (https://www.tensorflow.org/)

TensorFlow와 같이 다른 for Machine Intelligence 라이브러리가 존재한다. 

그럼에도 불구하고 TensorFlow를 선택한 이유는 github 통계에서 순위가 1등이기 때문이다.


 순위

이름

점수 

 1

 Tensorflow  

 172

 2

 caffe

 89

 3

 keras 

 69

 4

 mxnet

 53

 5

 theano

 38

 6

 deeplearning4j

 29

 7

 cntk

 27

 8

 torch7

 17

 9

 paddle

 14

 ...

 ...

 ...


즉, 많은 사람들이 사용하기 때문에 레퍼런스가 많을 것이기 때문이라 최적하다고 판단했다.


tensorflow는 data flow graphs라는 것을 사용해서 어떤 numerical 한 계산 을 할 수 있는 라이브러리이며

python 언어를 사용하여 프로그래밍을 할 수 있다.


1. data flow graphs

data flow graphs란 노드와 노드 간의 연결되어있는 Edge를 Graph라고 말한다.

[이미지 출처 : https://gist.github.com/haje01/202ac276bace4b25dd3f]


아래 파란색으로 표시한 부분을 node, 빨간색으로 표시한 node와 node 간을 이어주는 선을 edge라고 이해하면 된다.


data flow graph에서 node는 하나의 operation이라고 보면 된다. 쉽게 말해 계산을 수행하고, 결과를 하나 이상의 Tensor로 반환할 수 있다. Edge란 쉽게 말해 데이터이다. Edge는 동적 사이즈의 다차원 데이터 배열(=Tensor)을 실어 나르는데, 여기서 tensorflow라는 이름이 지어졌다고 한다.


위의 글에서 Tensor라는 단어가 생소할 텐데 Tensor란 다양한 분야에서 사용되는 개념인데 분야마다 조금씩 다른 의미로 해석되며 여기에서는 학습 데이터가 저장되는 다차원 배열 정도로 이해하면 된다.


2. TensorFlow 특징

   - data flow graph를 통한 풍부한 표현력

   - 코드 수정 없이 CPU/GPU 모드로 동작

   - 아이디어 테스트에서 서비스 단계까지 이용 가능

   - 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산을 처리

   - Python/C++을 지원하며, SWIG(http://www.swig.org/)를 통해 다양한 언어 지원 가능


3. TensorFlow 설치(https://www.tensorflow.org/install/#download-and-setup)

   [ Ubuntu16.04 기준(python3.x) ]

sudo apt-get install python3-pip python3-dev python-virtualenv # python 3.x 설치 virtualenv --system-site-packages -p python3 {원하는 이름 입력} // 해당 명령이 성공하면 virtualenv를 사용하여 독립된 가상환경 구축 source ./tensorflow/bin/activate // virtualenv 를 활성화 한다. 비활성화는 활성화된 상태에서 deactivate 명령 실행 (tensorflow)$ python --version // 파이썬 버전 확인 (tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp34-cp34m-linux_x86_64.whl // 파이썬 버전에 텐서플로우 바이너리 URL을 찾고 export한다.

    - 위의 export 하는 내용은 os 버전 및 python 버전에 따라 상이하므로 아래를 참고하여 자신에 맞는 바이너리를 export 해주자. 

// 리눅스 bit 확인
// x86_64(=64bit), i686(=32bit)
uname -m 
// Ubuntu/Linux 64-bit, CPU only, Python 2.7
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

// Ubuntu/Linux 64-bit, GPU enabled, Python 2.7 
// Requires CUDA toolkit 7.5 and CuDNN v4. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

// Mac OS X, CPU only, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py2-none-any.whl

// Ubuntu/Linux 64-bit, CPU only, Python 3.4
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp34-cp34m-linux_x86_64.whl

// Ubuntu/Linux 64-bit, GPU enabled, Python 3.4 
// Requires CUDA toolkit 7.5 and CuDNN v4. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0-cp34-cp34m-linux_x86_64.whl

// Ubuntu/Linux 64-bit, CPU only, Python 3.5
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp35-cp35m-linux_x86_64.whl

// Ubuntu/Linux 64-bit, GPU enabled, Python 3.5 
// Requires CUDA toolkit 7.5 and CuDNN v4. For other versions, see "Install from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.9.0-cp35-cp35m-linux_x86_64.whl

// Mac OS X, CPU only, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py3-none-any.whl


    - pip를 이용하여 Tensorflow 설치 명령을 입력한다.

(tensorflow)$ pip3 install --upgrade $TF_BINARY_URL


4. TensorFlow 테스트 ( 위의 설치 과정중 virtualenv을 활성화를 시키고 있는 가정하에 진행한다. )

   (1) 텐서플로우 버전 확인 

 (tensorflow)$ python
 >>> import tensorflow as tf // tensorflow 모듈을 import후 사용하기 편하게 별칭 설정(tensorflow -> tf)
 >>> tf.__version__
'0.9.0'


   (2) Hello World 찍기

// Hello, TensorFlow!라는 문자열이 들어가 있는 하나의 노드가 생성된 것이다. // 즉, tf.constant라는 노드 생성 >>> hello = tf.constant('Hello, TensorFlow!') // tf.constant 노드에 대한 세션을 생성한다. >>> sess = tf.Session() // tf.constant 노드를 실행시킨다. >>> print(sess.run(hello)) // 결과 // 실행하면 b라는 문자열이 같이 들어와서 이상하게 생각할 것이다. 이것은 그냥 바이트 스트림이라는 뜻이라고 보면 된다. // Byte Stream은 데이터를 Byte 단위로 주고받는 것을 말한다. b'Hello, TensorFlow!'


   (3) A와 B라는 노드가 있고 노드가 더하기라는 노드로 연결하는 그래프를 만들어보자.

       ex) 

>>> node1 = tf.constant(3.0, tf.float32) // tf.float32 는 자료형을 뜻한다. 즉, 데이터형식 지정함.
>>> node2 = tf.constant(4.0) // 암묵적으로 tf.float32 형태이다.
>>> node3 = tf.add(node1, node2) // node3 = node1 + node2
>>> print("node1 : ", node1, "node2 : ", node2)
node1 :  Tensor("Const:0", shape=(), dtype=float32) node2 :  Tensor("Const_1:0", shape=(), dtype=float32)

>>> print("node3: ", node3)
node3:  Tensor("Add:0", shape=(), dtype=float32)

       - 위의 print로 찍은 결괏값을 보면 원하는 답이 안 나올 것이다. 이것은 tensor라는 것에 대한 내용을 출력한 것이다.

         결과를 출력하려면 세션을 생성하고 run을 통하여 해당 그래프의 노드를 실행시키면 된다. 아래 코드를 참조하자.

>>> sess = tf.Session()

>>> print("sess.run(node1, node2): ", sess.run([node1, node2]))
sess.run(node1, node2):  [3.0, 4.0]

>>> print("sess.run(node3): ", sess.run(node3))
sess.run(node3):  7.0


5. Tensorflow Mechanics

    - Tensorflow의 기본 구조는 아래 이미지를 참고하자.

      (1) graph를 build 한다. (노드들을 정의한다.)

      (2) sess.run을 통해서 graph를 실행한다.

      (3) graph 속에 있는 값들을 return 한다.

      * Tensorflow는 이렇게 나누어져서 프로그래밍하고 실행된다고 이해하면 된다.

Image 1. TensorFlow Mechanics (src: www.mathwarehouse.com)


    - 위의 4번의 (3)에 예제를 기준으로 Tensorflow의 기본 구조를 쉽게 이해하게끔 주석으로 표시한 내용을 아래 참고하자.

// (1) graph를 build한다.
>>> node1 = tf.constant(3.0, tf.float32) // tf.float32 는 자료형을 뜻한다. 즉, 데이터형식 지정함.
>>> node2 = tf.constant(4.0) // 암묵적으로 tf.float32 형태이다.
>>> node3 = tf.add(node1, node2) // node3 = node1 + node2
// (2) sess.run을 통해서 graph를 실행한다.
// (3) graph 속에 있는 값들을 return 한다.
>>> sess = tf.Session()
>>> print("sess.run(node1, node2): ", sess.run([node1, node2]))
>>> print("sess.run(node3): ", sess.run(node3))


6. Placeholder

    - 여태까지 graph를 그려서 실행하는 방법을 알아냈다. 그런데 그래프를 실행시키는 단계에서 값들을 던져주고 싶을 때Placeholder이라는 특별한 노드를 만들어준다.

>>> a = tf.placeholder(tf.float32) >>> b = tf.placeholder(tf.float32) >>> adder_node = a + b // tensorflow 입장에서 보면 graph 실행 하고 싶은데 계산해야 될 값들을 모르고 있으므로 // placeholder에 그 값이 있다고 알려주고 그걸 넘겨달라고 요청할 때 feed_dict를 사용한다. // 그래서 3+4.5 이므로 7.5가 결괏값이 된다. >>> print(sess.run(adder_node, feed_dict={a: 3, b: 4.5})) 7.5 // 무조건 위의 형태 말고 아래와 같은 형태로 넘겨줘도 된다. 계산은 같은 자리끼리 계산이 되므로 // 1+2 = 3, 3+4=7 --> [3. 7.]이 된다. >>> print(sess.run(adder_node, feed_dict={a: [1,3], b: [2,4]})) [3. 7.]

    * 위와 같은 식으로 graph를 한번 만들어놓은 다음에는 필요한 값들을 placeholder를 이용한다면즉, sess.run을 할 때 feed_dict로 값을 넘겨주면서 해당 계산에 대한 결괏값을 리턴해준다.


7. Everything is Tensor

    일반적으로 Tensor라는 것은 [1. ,2., 3.] 와 같은 Array를 말한다. 주로 Tensor를 이야기할 때는 Tensor Ranks, Shapes, and Types으로 이야기한다.

    (1) Tensor Rank : 몇 차원 array인지 말하는 것이다.

 Rank

 Math entity

Python example 

 0

 Scalar (magnitude only) : 0차원 배열

 s = 100 

 1

 Vector (magnitude and direction) : 1차원 배열

 v = [1,2,3] 

 2

 Matrix (table of numbers) : 2차원 배열

 m = [[1,2,3], [1,2,3]] 

 3

 3-Tensor (cube of numbers) : 3차원 배열

 t = [[2], [4], [6], [[8], [9], [10]]] 

 4

 n-Tensor (you get the idea) : n차원 tensor

 ... 


    (2) Tensor Shape : 각각의 Element에 몇 개씩 들어있는지를 말하는 것이다.

 Rank

 Shape 

 Dimension number 

 Example 

 0

 [] 

 0-D 

 A 0-D tensor. A Scalar

 1

 [D0] 

 1-D 

 A 1-D tensor with shape [5] 

 2

 [D0, D1] 

 2-D 

 A 2-D tensor with shape [3, 4] 

 3

 [D0, D1, D2] 

 3-D 

 A 3-D tensor with shape [1, 4, 3] 

 n

 [D0, D1, ...., Dn-1] 

 n-D 

 A tensor with shape [D0, D1, ..., Dn-1] 

ex) t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

    -> 제일 안쪽의 Element가 3개이고, 각 배열이 3개이므로 [3, 3] 이라고 shape을 나타낸다.


    (3) Data Type

 Data type

 Python type 

 Description 

 DT_FLOAT

 tf.float32 

 32 bits floating point 

 DT_DOUBLE

 tf.float64 

 64 bits floating point 

 DT_INT8

 tf.int8 

 8 bits signed integer 

 DT_INT16

 tf.int16 

 16 bits signed integer 

 DT_INT32

 tf.int32 

 32 bits sigend integer 

 DT_INT64

 tf.int64 

 64 bits sigend integer 

....

        - 대부분의 경우에는 float32, int32를 많이 사용한다.



** TensorFlow에 대해 마지막으로 정리하자면 

   -> 일반 프로그래밍과는 달리 graph를 설계하고, graph를 실행시키고 그 때 우리가 필요한 값들을 placeholder로 넘겨줄 수 있고 그 결과로 graph 값들이 변하거나 graph가 어떤 것을 return 한다. 이런 방법으로 우리가 tensorflow 프로그래밍을 할 수 있다.



참조: https://www.inflearn.com/course/%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EA%B0%95%EC%A2%8C/dashboard

반응형

'AI or APP > Tensorflow' 카테고리의 다른 글

multi-variable linear regression  (0) 2019.12.01
cost 최소화 알고리즘 설명  (0) 2018.07.15
Linear Regression  (0) 2018.07.04
머신러닝이란  (0) 2018.06.18
Comments