[Python] Deep Learning – Tensorflow 기초

Tensorflow?

  • Tensorflow는 기계 학습과 딥러닝 오픈소스 라이브러리
  • Tensorflow는 방향성이 있는 그래프 구조를 말하며 그래프구조는 모델을 구성함
  • Data Flow Graph는 0개 이상의 입출력을 갖는 노드들의 연결체## 설치
  • 1) 도커툴박스설치: https://www.docker.com/products/docker-toolbox
  • 2) 도커실행 후 도커 이미지 다운로드 : docker pull psygement/marketon_dnlp:0.1
  • 3) docker run -it –name=[your_container_name] -p 8888:8888 -p 6006:6006 -e “TZ=Asia/Seoul” -v [your_host_directory]:/notebooks/work psygement/marketon_dnlp:0.1
  • ex) docker run -it –name=run_marketon -p 8888:8888 -p 6006:6006 -e “TZ=Asia/Seoul” -v /User/kims:/notebooks/work psygement/marketon_dnlp:0.1

용어

텐서플로우 관련 용어

  • Operation : 임의의 계산을 수행하는 것으로 다양한 속성 값(attribute)을 가짐
  • Variable : 학습을 통해 변화하는 배열값을 저장하기 위한 operation
  • Tensor : 임의의 차원을 가진 배열을 의미
  • Session : 그래프를 구성한 후 실제 수행을 할 때 다양한 실행 환경(CPU, CPU/GPU, 원격 분산처리) 하에서 처리하기 위해서 Client 에서 session을 만들어 전달.

기본자료구조 : 텐서

  • 텐서플로우는 텐서라는 기본자료구조로 모든 데이터를 표현함
  • 텐서는 동적 크기를 갖는 다차원 데이터 배열로 불리언, 문자열, 숫자 등의 정적자료형을 가짐
  • 각 텐서는 배열의 차원을 나타내는 rank를 가짐
  • t = [[1,2,3],[4,5,6],[7,8,9]] (이경우 랭크는 2), 랭크가 1인 텐서는 벡터, 랭크 0인 텐서는 스칼라값이 됨

데이터저장 : 변수와 상수

  • 데이터는 파일로 부터 얻거나 상수나 변수로 데이터를 메모리에 로드할수 있음
함수 설명
tf.constant() 상수를 생성하는 함수
tf.variable() 변수를 생성하는 함수
함수 설명
tf.zeros_like 모든 원소를 0으로 초기화 한 텐서생성
tf.one_like 모든 원소를 1로 초기화 한 텐서 생성
tf.fill 주어진 스칼라 값으로 원소를 초기화한 텐서 생성

텐서의 생성

  • 변수를 생성할때 상수나 난수로 초기값을 지정할 수 있음
함수 설명
tf.random_normal 정규분포를 따르는 난수 생성
tf.random_uniform 균등분포를 따르는 난수 생성
tf.truncated_normal 정규분포를 따르는 난수 + 2표준편차 벗어난 값은 제거

1. Hello Tensorfolw

  • 노드를 생성해 그래프를 만들기 (tf.constant)
  • 그래프를 실행시키기 (sess.run)
In [9]:
import numpy as np
import tensorflow as tf
hello = tf.constant('hello tensorflow!')
print hello
Tensor("Const_5:0", shape=(), dtype=string)
In [2]:
sess = tf.Session()
print sess.run(hello)
hello tensorflow!

2. Everything is operation!

In [3]:
sess = tf.Session()
a = tf.constant(2)
b = tf.constant(3)
c = a + b
print c 
Tensor("add:0", shape=(), dtype=int32)
In [4]:
print sess.run(c)
5
In [5]:
a = tf.constant(2)
b = tf.constant(3)

with tf.Session() as sess:
    print "a=2, b=3"
    print "addition with constant: %i" % sess.run(a+b)
    print "multiplication with constant: %i" % sess.run(a*b)
a=2, b=3
addition with constant: 5
multiplication with constant: 6

3. Placeholder

  • 모델을 생성하고 실행할 때 인풋값의 유형을 미리 정해놓을 수 있음
  • 모델이 실행되는 시점에 인풋값을 바꿀수 있음
  • tf.train.SummaryWriter(‘/tmp’, sess.graph)
In [6]:
#그래프 들어갈수 있는 인풋값을 정의
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)

#오퍼레이션을 정의
add = tf.add(a, b)
mul = tf.mul(a, b)

with tf.Session() as sess:    
    print "Addtion with variable: %i" % sess.run(add, feed_dict={a: 2, b: 3})
    print "Multiplication with variables: %i" % sess.run(mul, feed_dict={a: 2, b: 3})
Addtion with variable: 5
Multiplication with variables: 6

4. Linear regression 구현하기

In [8]:
# 데이터
x_data = [1., 2., 3., 4.]
y_data = [2., 4., 6., 8.]

# try to find values for w and b that compute y_data = W * x_data + b
# range is -100 ~ 100
W = tf.Variable(tf.random_uniform([1], -10000., 10000.))
b = tf.Variable(tf.random_uniform([1], -10000., 10000.))

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# 회귀식 정의
hypothesis = W * X + b

# 코스트 함수 정의  : 회귀식이 예측하지 못한 오차값을 리턴해줌
cost = tf.reduce_mean(tf.square(hypothesis - Y))

# 코스트를 최소화하는 최적화 알고리즘 GradientDescentOptimize(경사하강법)으로 학습
a = tf.Variable(0.1)  # learning rate : 학습을 반복할때 이동할 크기
optimizer = tf.train.GradientDescentOptimizer(a)
train = optimizer.minimize(cost)  # goal is minimize cost

# 변수초기화
init = tf.initialize_all_variables()

# 알고리즘 실행
sess = tf.Session()
sess.run(init)

for step in xrange(2001):
    sess.run(train, feed_dict={X: x_data, Y: y_data})
    if step % 20 == 0:
        print step, sess.run(cost, feed_dict={X: x_data, Y: y_data}), sess.run(W), sess.run(b)
0 1.12547e+08 [ 1138.93847656] [ 7690.03515625]
20 2.12165e+06 [-1209.14074707] [ 3564.57421875]
40 628974.0 [-658.04931641] [ 1940.62658691]
60 186463.0 [-357.38265991] [ 1056.62902832]
80 55278.3 [-193.6761322] [ 575.31170654]
100 16387.6 [-104.54141998] [ 313.24478149]
120 4858.22 [-56.00951767] [ 170.55503845]
140 1440.25 [-29.58492279] [ 92.86352539]
160 426.973 [-15.1973114] [ 50.56218719]
180 126.579 [-7.36356401] [ 27.53001976]
200 37.5252 [-3.09825873] [ 14.98950195]
220 11.1246 [-0.7758916] [ 8.16145992]
240 3.29796 [ 0.48858699] [ 4.44373846]
260 0.977703 [ 1.17706835] [ 2.41951966]
280 0.289846 [ 1.5519315] [ 1.31737614]
300 0.085927 [ 1.7560364] [ 0.71728283]
320 0.0254736 [ 1.86716712] [ 0.39054501]
340 0.00755183 [ 1.92767549] [ 0.21264334]
360 0.00223879 [ 1.96062076] [ 0.11577966]
380 0.000663705 [ 1.97855878] [ 0.06303947]
400 0.000196762 [ 1.98832595] [ 0.03432375]
420 5.83303e-05 [ 1.99364364] [ 0.01868849]
440 1.72924e-05 [ 1.99653912] [ 0.01017548]
460 5.12659e-06 [ 1.99811554] [ 0.00554028]
480 1.51988e-06 [ 1.99897408] [ 0.00301661]
500 4.50552e-07 [ 1.99944139] [ 0.00164242]
520 1.33572e-07 [ 1.9996959] [ 0.00089427]
540 3.95903e-08 [ 1.9998343] [ 0.00048689]
560 1.17378e-08 [ 1.99990988] [ 0.00026512]
580 3.47302e-09 [ 1.999951] [ 0.00014436]
600 1.03341e-09 [ 1.9999733] [  7.85847005e-05]
620 3.04567e-10 [ 1.99998534] [  4.27742234e-05]
640 9.17453e-11 [ 1.99999189] [  2.32954244e-05]
660 2.66169e-11 [ 1.99999571] [  1.27215599e-05]
680 8.14282e-12 [ 1.99999762] [  6.90414618e-06]
700 2.16005e-12 [ 1.99999869] [  3.76894241e-06]
720 7.95808e-13 [ 1.9999994] [  2.05232868e-06]
740 4.12115e-13 [ 1.99999952] [  1.07481276e-06]
760 1.13687e-13 [ 1.99999988] [  6.45659156e-07]
780 1.13687e-13 [ 1.99999988] [  5.14529006e-07]
800 1.42109e-14 [ 1.99999988] [  3.23794296e-07]
820 1.42109e-14 [ 2.] [  1.92664174e-07]
840 0.0 [ 2.] [  1.09217652e-07]
860 0.0 [ 2.] [  1.09217652e-07]
880 0.0 [ 2.] [  1.09217652e-07]
900 0.0 [ 2.] [  1.09217652e-07]
920 0.0 [ 2.] [  1.09217652e-07]
940 0.0 [ 2.] [  1.09217652e-07]
960 0.0 [ 2.] [  1.09217652e-07]
980 0.0 [ 2.] [  1.09217652e-07]
1000 0.0 [ 2.] [  1.09217652e-07]
1020 0.0 [ 2.] [  1.09217652e-07]
1040 0.0 [ 2.] [  1.09217652e-07]
1060 0.0 [ 2.] [  1.09217652e-07]
1080 0.0 [ 2.] [  1.09217652e-07]
1100 0.0 [ 2.] [  1.09217652e-07]
1120 0.0 [ 2.] [  1.09217652e-07]
1140 0.0 [ 2.] [  1.09217652e-07]
1160 0.0 [ 2.] [  1.09217652e-07]
1180 0.0 [ 2.] [  1.09217652e-07]
1200 0.0 [ 2.] [  1.09217652e-07]
1220 0.0 [ 2.] [  1.09217652e-07]
1240 0.0 [ 2.] [  1.09217652e-07]
1260 0.0 [ 2.] [  1.09217652e-07]
1280 0.0 [ 2.] [  1.09217652e-07]
1300 0.0 [ 2.] [  1.09217652e-07]
1320 0.0 [ 2.] [  1.09217652e-07]
1340 0.0 [ 2.] [  1.09217652e-07]
1360 0.0 [ 2.] [  1.09217652e-07]
1380 0.0 [ 2.] [  1.09217652e-07]
1400 0.0 [ 2.] [  1.09217652e-07]
1420 0.0 [ 2.] [  1.09217652e-07]
1440 0.0 [ 2.] [  1.09217652e-07]
1460 0.0 [ 2.] [  1.09217652e-07]
1480 0.0 [ 2.] [  1.09217652e-07]
1500 0.0 [ 2.] [  1.09217652e-07]
1520 0.0 [ 2.] [  1.09217652e-07]
1540 0.0 [ 2.] [  1.09217652e-07]
1560 0.0 [ 2.] [  1.09217652e-07]
1580 0.0 [ 2.] [  1.09217652e-07]
1600 0.0 [ 2.] [  1.09217652e-07]
1620 0.0 [ 2.] [  1.09217652e-07]
1640 0.0 [ 2.] [  1.09217652e-07]
1660 0.0 [ 2.] [  1.09217652e-07]
1680 0.0 [ 2.] [  1.09217652e-07]
1700 0.0 [ 2.] [  1.09217652e-07]
1720 0.0 [ 2.] [  1.09217652e-07]
1740 0.0 [ 2.] [  1.09217652e-07]
1760 0.0 [ 2.] [  1.09217652e-07]
1780 0.0 [ 2.] [  1.09217652e-07]
1800 0.0 [ 2.] [  1.09217652e-07]
1820 0.0 [ 2.] [  1.09217652e-07]
1840 0.0 [ 2.] [  1.09217652e-07]
1860 0.0 [ 2.] [  1.09217652e-07]
1880 0.0 [ 2.] [  1.09217652e-07]
1900 0.0 [ 2.] [  1.09217652e-07]
1920 0.0 [ 2.] [  1.09217652e-07]
1940 0.0 [ 2.] [  1.09217652e-07]
1960 0.0 [ 2.] [  1.09217652e-07]
1980 0.0 [ 2.] [  1.09217652e-07]
2000 0.0 [ 2.] [  1.09217652e-07]

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다