Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

TensorFlow 설치

TensorFlow는 Python 2.7과 Python3.3+를 지원한다. Pip, Virtualenv, Anaconda, 도커(Docker)를 이용한 설치를 지원한다. 나는 도커 기반으로 설치하기로 했다. 설치 환경은 다음과 같다.
  • 우분투리눅스 15.10
  • 커널 : Linux home 4.2.0-42-generic #49-Ubuntu SMP
  • GPU : 없음. TensorFlow가 좀 익숙해지면 GPU 구입을 고민해봐야 겠다.
  • CPU : Intel Core i5-4670 CPU @ 3.40GHz x 4
  • 도커 : docker 1.12.1
4개의 도커 이미지를 사용 할 수 있다.
  • gcr.io/tensorflow/tensorflow: TensorFlow CPU binary image.
  • gcr.io/tensorflow/tensorflow:latest-devel: CPU Binary image plus source code.
  • gcr.io/tensorflow/tensorflow:latest-gpu: TensorFlow GPU binary image.
  • gcr.io/tensorflow/tensorflow:latest-devel-gpu: GPU Binary image plus source code.
도커 설치과정은 아래와 같다.
  • 운영체제에 도커를 설치한다.
  • sudo를 이용해서 root 권한으로 컨테이너를 실행하거나 혹은 일반계정을 docker group에 등록한다
  • TensorFlow 이미지로 부터 도커 컨테이너를 실행한다.
TensorFlow 컨테이너를 실행했다.
# docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow
[I 15:05:29.519 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 15:05:29.528 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[W 15:05:29.528 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using authentication. This is highly insecure and not recommended.
[I 15:05:29.532 NotebookApp] Serving notebooks from local directory: /notebooks
[I 15:05:29.533 NotebookApp] 0 active kernels 
[I 15:05:29.533 NotebookApp] The Jupyter Notebook is running at: http://[all ip addresses on your system]:8888/
[I 15:05:29.533 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[I 15:12:15.974 NotebookApp] 302 GET / (172.17.0.1) 0.64ms
아직 이미지를 설치하지 않았다면, 자동으로 이미지를 설치 할 것이다. 컨테이너가 실행되면 Jupyter Notebook이 실행된다. localhost:8888로 접속해보자.

 Tensorflow jupyter 화면

Jupyter Notebook는 데이터 과학분야에서 python을 쉽게 사용 할 수 있도록 개발된 웹 애플리케이션이다. 마크다운(MarkDown) 스타일의 코드를 포함한 문서를 만들어서 다른 사람과 공유 할 수 있다. 코드는 웹 상에서 직접 실행 할 수 있으며, 그 결과를 텍스트 뿐만 아니라 그래프(plot 형태)로 즉시 확인 할 수 있다. 또한 웹 터미널을 이용해서 python 코드를 직접 입력하고 실행 할 수도 있는 유용한 툴이다.

Joinc.co.kr에 설치

위치에 상관 없이 꾸준히 공부할 생각으로 내 사이트(joinc.co.kr)에 설치했다. VirtualHost 로 접근 할 수 있도록 NginX 설정을 변경했다. 사이트 이름은 jupyter.joinc.co.kr이다. 개인 공간으로 사용 할 거라서 HTTP Basic Auth를 설정했다. 까먹지 않게 기록으로 남긴다.

/etc/nginx/site-available/jupyter.joinc.co.kr 파일을 만들었다.
server {
    root /var/www/;
    index index.html index.htm;

    server_name jupyter.joinc.co.kr jupyter.joinc.co.kr

    charset utf-8;
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;

    location / {
        proxy_pass http://127.0.0.1:8888;
    }
}
이 파일을 site-enable에 링크 한 다음 서비스를 리스타트하면 끝
# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/jupyter.joinc.co.kr ./ 
# service nginx restart
텐서공부하는 내용들은 여기에 차곡차곡 쌓아야 겠다.

Latex 플러그인 개발

수식이 엄청나게 많이 나온다. 만들기가 귀찮아서 codecogs 서비스를 빌려서 사용하기로 했다. 그리하여 Latex 수식일 입력하면 codecogs에 요청해서 gif 이미지를 만든 다음 출력하는 간단한 플러그인을 개발 했다. 오케이 잘 된다.

기본 사용 법

TensorFlow를 이용하기 위해서는 아래의 것들을 이해해야 한다.
  • 그래프에서 계산의 표현
  • 세션(Session)에서의 그래프의 실행
  • 데이터를 텐서로 표현
  • 변수(Variable)를 이용한 상태 관리
  • Feed와 Fatch를 이용해서 임의의 작업에서 데이터를 가져오기.

OverView

TensorFlow는 그래프로 컴퓨팅계산을 표현하는 프로그래밍 시스템이다. 그래프의 노드는 op(operation)로 표현 되며, 이들은 하나 이상의 텐서를 읽어서 처리 한다. 텐서는 다차원 배열 데이터다. op 사이에 주고 받는 데이터의 타입이 텐서다 라고 이해하면 되겠다.

TensorFlow 그래프는 수행할 계산에 대한 설명을 담고 있다. 계산을 시작하기 위해서 그래프는 반드시 세션을 만들어서 실행해야 한다. 세션은 CPU나 GPU와 같은 장치에 op를 배치하고 실행하기 위한 메서드들을 제공한다. 이들 메서드들은 python의 numpy ndarray 객체나 C, C++의 tensorflow::Tensor 인스턴스를 수행하고 그 텐서를 반환한다.

그래프 만들기

1 x 2, 2 x 1 두개의 행렬(Matrix)를 곱하는 일을하는 그래프를 만든다고 가정해 보자. 이 그래프는 행렬을 반환하는 상수형 op 2개와 행렬곱 연산을 하는 하나의 op, 도합 3개의 op를 가질 것이다.
import tensorflow as tf

# 1x2 행렬 정보를 저장하고 있는 constant op
matrix1 = tf.constant([[3., 3.]])

# 2x1 행렬 정보를 저장하고 있는 constant op
matrix2 = tf.constant([[2.],[2.]])

# matrix1과 matrix2를 매개변수로 받아서 곱 연산을 한 다음 product로 반환하는 op  
product = tf.matmul(matrix1, matrix2)

op를 수행해서 결과를 얻기 위해서는 session에 있는 그래프를 실행해야 한다.

세션에 있는 그래프 실행하기

Session 클래스로 세션을 만들고 실행 할 수 있다.
# 기본 세션을 만든다. 
sess = tf.Session()

# run() 메서드를 호출해서 product에 있는 '''matmul''' op를 실행한다. 
# run(product)를 호출하면 그래프에 있는 두개의 constants와 matmul op, 총 3개의 op를 수행한다. 
result = sess.run(product)
print(result)
# ==> [[ 12. ]]

# 작업이 끝난 Session을 닫는다.
sess.close()
이 연산은 로 원하는 결과가 나왔음을 확인 할 수 있다.

예제에서는 session.Close() 메서드를 호출했는데, "with" 블럭문을 이용하면 블럭문을 빠져나갈 때, 자동으로 Close() 메서드가 호출된다.
with tf.Session() as sess:
  result = sess.run([product])
  print(result)

TenslorFlow는 그래프를 CPU나 GPU등의 컴퓨팅 리소스를 분산시킬 수 있다. 일반적으로 CPU나 GPU를 명시적으로 지정 할 필요는 없다. GPU가 있다면 우선 사용한다. 컴퓨터에 하나 이상의 GPU가 있다면 명시적으로 CPU를 할당해야만 한다.
with tf.Session() as sess:
  with tf.device("/gpu:1"):
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1, matrix2)
    ...
디바이스는 아래와 같이 지정 할 수 있다.
  • "/cpu:0": 머신에 있는 CPU
  • "/gpu:0" : 머신에 있는 첫번째 GPU
  • "/gpu:1" : 머신에 있는 두번째 GPU
좀 사용해 보고 싶지만 GPU가 없어서.. 조만간 구입해야지.

Tensor

TensorFlow 프로그램은 모든 데이터를 텐서 데이터 스트럭처로 나타낸다. 그래프를 구성하는 오퍼레이션들은 오로지 텐서만 사용한다. 텐서는 N-차원의 배열이나 리스트라고 생각하면 이해가 쉬울 것이다.

Variables

Variables는 그래프의 실행 사이에서 관리 할 수 있는 값이다. 변수라고 생각 하면 된다. 아래는 Variables의 간단한 예제다.
# Variable를 만든다. 이름은 "counter"이고 초기 값은 0이다.
state = tf.Variable(0, name="counter")

# constant 타입의 Op를 하나 만들고, state에 더한다.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# Variables는 사용하기 전에 반드시 Op로 초기화를 해줘야 한다. 
init_op = tf.initialize_all_variables()

# 그래프에서 op를 수행한다.
with tf.Session() as sess:
  # init op를 실행한다. 
  sess.run(init_op)
  # stat의 초기 값 0을 출력한다.
  print(sess.run(state))
  # update op를 실행하고, 현재 state 값을 출력한다. 
  for _ in range(3):
    sess.run(update)
    print(sess.run(state))

# 출력 : 
# 0
# 1
# 2
# 3
assign 오퍼레이션은 add 오퍼레이션의 일부분이기 때문에 run()이 실행되기 전까지는 할당되지 않는다.

개발자들은 일반적으로 변수의 집합으로 통계 모델의 매개 변수를 나타낸다. 예를 들어 뉴럴 네트워크의 가중치를 저장하기 위해서 사용 할 수 있다. 그래프를 반복적으로 실행하면서 이 텐서를 업데이트 하면서 훈련 할 수 있다.

Fetches

Session 객체의 run()으로 그래프에서 실행된 op의 출력 값을 가져올 수 있다.
input1 = tf.constant([3.0])
input2 = tf.constant([2.0])
input3 = tf.constant([5.0])
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)

# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

Feed

위에 있는 텐서 예제들에서는 Constant와 Variables에 저장된 값들을 계산했다. TensorFlow는 그래프에서 모든 operation에 대해서 직접 피드 할 수 있는 매커니즘을 제공한다. 보통 placeholder()를 이용해서 데이터를 피드 한다.
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

# output:
# [array([ 14.], dtype=float32)]

참고