티스토리 뷰

Tensorflow의 기본적인 Operations

Tensorflow란?

텐서플로우는 Machine Intelligence을 위해 구글에서 만든 오픈소스 라이브러리이다.
Data flow Graph를 이용해 수치 계산(numerical computaion)을 할 수 있다.

Data Flow Graph

Data Flow Graph는 수학 계산과 데이터의 흐름을 노드(Node)와 엣지(Edge)를 사용한 방향 그래프(Directed Graph)로 표현한다.

위 그림은 텐서플로우가 그래프라고 하는 자료구조(Data Structure)처럼 동작한다는 것을 알려주는 그림이다. 그래프는 정거장처럼 보이는 노드가 간선(edge)으로 연결된 다른 노드로 이동할 수 있다는 것을 전제로 한다. 연결되어 있기만 하면 어디든 가기 때문에, 이론적으로는이동할 수 있는 노드 갯수에 제한이 없다. 그래서, 일반적으로는 노드가 간선보다 상대적으로 더 중요하다. 이유는 단순하게 이동할 수 있는 방법만 제안하면 되기 때문이다.


노드는 수학적 계산, 데이터의 입/출력, 그리고 데이터의 읽기/저장 등의 작업을 수행한다. 엣지는 노드들 간 데이터의 입출력 관계를 나타낸다. 더 쉽게 말하면 에찌는 노드간에 전달되는 다차원 데이터 배열(tensor)이라고 하면 된다.


Tensorflow의 특징

● Data flow Graph를 통한 풍부한 표현력
● 코드 수정 없이 CPU/GPU 모드로 동작
● 아이디어 테스트에서 서비스 단계까지 이용 가능
● 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산 처리
● python/C++를 지원하며, SWIG를 통해 다양한 언어 지원 가능

기본 개념 익히기

용어

오퍼레이션(Operation)

그래프 상의 노드는 오퍼레이션(op)으로 불린다. 오퍼레이션은 하나 이상의 텐서를 받을 수 있다. 오퍼레이션은 계산을 수행하고, 결과를 하나 이상의 텐서로 반환할 수 있다.

텐서(Tensor)

내부적으로 모든 데이터는 테서를 통해 표현된다. 텐서는 일종의 다차원 배열인데, 그래프 내의 오퍼레이션 간에는 텐서만이 전달된다.

세션(Session)

그래프를 실행하기 위해서는 세션 객체가 필요하다. 세션은 오퍼레이션의 실행 환경을 캡슐화한 것이다.


변수(Variables)

변수는 그래프의 실행시, 파라미터를 저장하고 갱신하는데 사용된다. 메모리 상에서 텐서를 저장하는 버퍼 역할을 한다.



Hello, Tensorflow!

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf
# Hello, Tensorflow!라는 문자열이 들어있는 node생성
hello=tf.constant("Hello, Tensorflow!")
 
# TF 세션 시작
sess = tf.Session()
 
# 특정 노드 세션 run
print(sess.run(hello))
cs


python 3.x를 사용할 경우결과에서 b'Hello, Tensorflow!'가 출력되는 데, b는 Byte literals를 나타내는 것이다.



Computational Graph

1
2
3
4
5
6
7
8
9
10
11
12
13
import tensorflow as tf
 
node1=tf.constant(3.0,tf.float32) # float32 노드 생성
node2=tf.constant(4.0)         # float 32 노드 생성
node3=tf.add(node1,node2)    # node1과 node2를 더하는 노드 생성
 
# Tensor("Add:0", shape=(), dtype=float32)
print("node1 :", node1, "node2:",node2)
print("node3: ",node3)
 
sess=tf.Session()
print("sess.run(node1, node2): ", sess.run([node1, node2])) #[3.0, 4.0]
print("sess.run(node3) : ", sess.run(node3)) # 7.0
cs


보통은 8,9줄처럼 출력하면 7.0이 나오겠지만 우리의 예상과 달리 

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

와 같이 나온다. 


그 이유는 머신러닝에서는 현재 데이터가 무엇인지 판단할 수 없는 상황이 매우 많다. 구동시켜 보기 전에는, 즉 run함수를 호출하기 전에는 값을 알 수 없기 때문에 일관되게 처리하기 위해서는 모든 텐서 객체에 대해 자신이 누구인지만 알려주는 요약본을 출력하기 때문이다.


따라서 12, 13줄 처럼 sess.run()을 실행하게 되면 우리가 원하는 결과 값을 얻게 되는 것이다.


위 코드가 구동되는 과정은 아래의 그림과 같다.




첫 번째, 텐서플로우의 노드를 정의한다. (위 코드에서 3,4,5줄)

두 번째, sess.run()을 통해 실행시키게 된다. (위 코드에서 11,12,13줄)

세 번째, 그래프 속에 있는 어떠한 값들이 업데이트 되거나 결과값이 리턴된다.

(11,12,13 줄에 결과 값이 있기에 결과값을 리턴함)



Placeholder

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import tensorflow as tf
 
a=tf.placeholder(tf.float32)
b=tf.placeholder(tf.float32)
 
add=tf.add(a,b)
 
with tf.Session() as sess:
 
    r1=sess.run(add, feed_dict={a:3, b:4.5})
    r2=sess.run(add, feed_dict={a: [1,3], b:[2,4]})
 
    print(type(r1)) # <class 'numpy.float32'>
    print(r1)    #7.5
    print(r2)    #[3. 7.]
cs


placeholder는 자리만 차지하고 있는 물건이나 사람을 뜻하는 영어 단어다. 텐서플로우에서는 이 단어가 매우 중요한 역할이 주어졌다. 머신러닝에 전달되는 데이터를 변경하기 위한 수단이 되었다. 기계에게 공부를 시킨 이유는 내가 궁금한 무언가를 물어보기 위해서이다. 그렇다면 궁금한 것을 전달해야 하고, 전달할 수 있는 문법이 있어야 하는데, 그것이 placeholder이다.


placeholder를 만들 때는 우리가 궁금해 하는 데이터의 자료형에 대해 알려줘야 한다. 여기서는 tf.float32라고 지정했고, 출력 결과는 <class 'numpy.float32'> 라고 표시됬다. 


add()로 덧셈 연산(노드)을 만들었고, 어떤 데이터를 전달할지는 나중에 결정할 수 있도록 placeholder로 처리했다. with 블록 안에서 add에 대해 결과를 요청하면서 3과 4.5를 파라미터로 전달했다. 지금은 별거 아닌 것처럼 보일 수 있지만, 그래프 기반이라서 add()와 것을 수십 개 연결할 수 있다고 생각해 보면 엄청나게 복잡한 연산을 매우 쉽게 처리할 수 있는 매우 효율적인 방법이라는 것을 알 수 있다. 


딕셔너리 자료형을 사용하기 때문에 파라미터의 갯수에는 제한이 없다. 100개를 전달해도 괜찮고 실전에서는 이러한 일들이 빈번하게 일어난다고 한다.


아래 그림은 위 코드를 그림으로 나타낸 것이다.




첫 번째, 텐서플로우 노드를 정의한다.(placeholder를 정의한다.)(위 코드에서 3,4줄)

두 번째, feed_dict={x:x_data}를 통해 값을 넘겨준다.(위 코드에서 10,11줄)

세 번째, 이 그래프가 실행되면서 어떠한 값들이 업데이트 되거나 값이 리턴된다.



Tensor Ranks




몇 차원의 배열인지를 나타낸 것


Tensor Shapes



각각의 요소에 몇개가 들어있느냐를 나타낸 것


Tensor Types



보통 float32, int32를 많이 사용












-----------------------------------------

위 글은https://hunkim.github.io/ml/, https://gist.github.com/haje01/202ac276bace4b25dd3f, http://pythonkim.tistory.com/8 

의 내용을 보고 정리한 글입니다.



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함