인공지능 AI

Tensorflow(텐서플로우) 설치와 기초

지금까지는 파이썬으로만 설계와 구현을 해왔는데요

 

합성곱신경망(CNN), 순환신경망(RNN)등의 동작 알고리즘은 복잡하고 코드도 방대하기 때문에

파이썬만으로는 무리가 있습니다.

 

따라서 텐서플로우의 기본을 알아보고 설치를 해보도록 하겠습니다.

 

텐서플로우는 구글에서 개발하고 공개한 딥러닝 프레임워크이고, C++ Java 등 많이 지원하지만 Python에 가장 최적화되어있다고 할 수 있습니다.

 

텐서플로우 설치

pip install tensorflow

pip install 기능을 사용하여 쉽게 설치할 수 있습니다.

만약에 설치할 때 에러가 나는 경우

python -m pip install --upgrade pip

pip버전을 업그레이드 한 후 

pip install --ignore-installed --upgrade tensorflow

를 실행하면 설치가 되는 것을 확인하실 수 있을 겁니다. 

 

 

텐서플로는 이름처럼 텐서(Tensor)를 흘려보내면서(Flow) 딥러닝알고리즘을 실행하는 프레임워크입니다.

텐서플로는 숫자 1,2,3 등의 스칼라를 rank 0 텐서로 인식하고

[1,2]와 같은 벡터는 rank 1 텐서로,

[[1,2],[3,4]]는 rank 2 텐서,

그리고 [[[1,2],[3,4]]] 같은 3차원 배열은 rank 3 텐서로 취급하고 있습니다. 

 

이와 같이 텐서라고 하면 우리가 알고있는 모든 데이터를 의미한다고 보면 됩니다. 

 

텐서플로 노드, 엣지

텐서플로는 이런 그래프처럼 엣지를 통해 텐서들을 노드에서 노드로 흘려보내는 딥러닝 학습을 진행합니다.

 

텐서플로 코드는 다음 두가지 단계를 거칩니다.

1. 상수, 변수, 텐서연산 등의 노드와 이를 연결하는 엣지----- 먼저 정의

2. 세션(Session)을 만들고 그 세션을 통해 노드에 있는 데이터(텐서)가 전달되고 연산이 이루어집니다. 

 

C언어에서 상수,변수,함수 먼저 선언 후 함수호출로 반복문,조건문 등을 실행하는 것과 비슷하다고 보면됩니다~

 

자 그렇다면 이제 텐서플로의 노드와 연산을 정의하고 실행하는 방법을 보겠습니다! 

 

상수 노드(Constant Node)

import tensorflow as tf


a = tf.constant(1.0, name='a')
b = tf.constant(2.0, name='b')
c = tf.constant([ [1.0, 2.0], [3.0, 4.0] ])
print(a)
print(a+b)
print(c)

sess = tf.Session()

print(sess.run([a, b]))
print(sess.run(c))
print(sess.run([a+b]))
print(sess.run(c+1.0))  # broadcast 수행

# 세션 close
sess.close()

결과

노드에 실제 값을 저장하고 노드 간의 연산을 하기 위해서는 세션을 만들어 주어야 합니다.

그 후 생성된 세션을 sess.run() 명령문을 통해 노드에 상수값 할당과 노드간 텐서 흘려보냄으로 a+b 수식, print 명령문이 실행됩니다.

 

마지막엔 sess.close()를 통해 리소스를 해제합니다. 

 

플레이스홀더 노드(Placeholder Node) 

텐서플로는 입력층으로 데이터를 보내기 위해 플레이스 홀더 노드를 정의합니다.

즉 플레이스홀더 노드는 딥러닝에서 입력데이터와 정답데이터를 입력층으로 보내는 용도로 사용됩니다. 

import tensorflow as tf

#placeholder node 정의
a = tf.placeholder(tf.float32)
b = tf.placeholder(tf.float32)
c = a+b

#Session을 만들고 placeholder node를 통해 값 입력 받음
sess = tf.Session()

print(sess.run(c, feed_dict={a:1.0, b:3.0}))
print(sess.run(c, feed_dict={a:[1.0,2.0], b:[3.0,4.0]}))

sess.close()

결과 

sess.run()에 2개의 인자를 주어서 데이터값을 연산하였는데

첫인자에는 placeholder을 통해 들어오는 데이터를 가지고 실행하는 연산이 들어가고 (c 즉, a+b 가 위의 경우의 연산)

두번쩨 인자에는 feed_dict={...} 형태로 실제 데이터를 넣는 명령문이 들어갑니다.

 

위의 경우 두번째 인자 feed_dict={a:1.0, b:3.0} 에서 a=1.0, b=3.0이 입력데이터값으로 c=a+b 연산을 통해 4.0 결과값이 출력되었습니다.

feed_dict={a:[1.0,2.0], b:[3.0,4.0]} 경우에도 c=a_b연산을 통해 [4.0, 6.0] 결과값이 출력되었습니다. 

 

 

변수 노드(Variable Node)

import tensorflow as tf

#값이 업뎃되는 변수노드 정의
W1=tf.Variable(tf.random_normal([1]))
b1=tf.Variable(tf.random_normal([1]))
W2=tf.Variable(tf.random_normal([1,2]))
b2=tf.Variable(tf.random_normal([1,2]))

sess = tf.Session()

#변수 노드 값 초기화. 변수 노드를 정의했다면 반드시 필요
sess.run(tf.global_variables_initializer())

for step in range(3):
    W1 = W1-step
    b1 = b1-step
    W2 = W2-step
    b2 = b2-step
    print("step=", step, ", W1= ", sess.run(W1),", b1= ", sess.run(b1))
    print("step=", step, ", W2= ", sess.run(W2), ", b2= ", sess.run(b2))

sess.close()

결과

신경망에서 가중치나 바이어스처럼 지속적으로 값이 변하는 변수의 경우에는 

변수노드(Variable Node)로 정의합니다.

 

위의 코드처럼 W1변수를 1개의값을가지는 벡터로 임의로 초기화합니다. 그 후에도 값이 지속적으로 변함을 볼 수 있습니다. 

여기까지는 정의만 했을 뿐 초기화는 안 한 상태입니다.

sess.run(tf.global_variables_initializer()) 를 실행해야 초기화까지 됩니다.

 

-1과 1 사이의 값으로 초기화한 후 반복문을 통해 변수노드값이 계속 업데이트됨을 확일할 수 있습니다.