티스토리 뷰
Tensorflow의 기본적인 Operations
Tensorflow란?
Data Flow Graph
위 그림은 텐서플로우가 그래프라고 하는 자료구조(Data Structure)처럼 동작한다는 것을 알려주는 그림이다. 그래프는 정거장처럼 보이는 노드가 간선(edge)으로 연결된 다른 노드로 이동할 수 있다는 것을 전제로 한다. 연결되어 있기만 하면 어디든 가기 때문에, 이론적으로는이동할 수 있는 노드 갯수에 제한이 없다. 그래서, 일반적으로는 노드가 간선보다 상대적으로 더 중요하다. 이유는 단순하게 이동할 수 있는 방법만 제안하면 되기 때문이다.
노드는 수학적 계산, 데이터의 입/출력, 그리고 데이터의 읽기/저장 등의 작업을 수행한다. 엣지는 노드들 간 데이터의 입출력 관계를 나타낸다. 더 쉽게 말하면 에찌는 노드간에 전달되는 다차원 데이터 배열(tensor)이라고 하면 된다.
Tensorflow의 특징
기본 개념 익히기
용어
오퍼레이션(Operation)
텐서(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
의 내용을 보고 정리한 글입니다.
'AI > 딥러닝(sung kim)' 카테고리의 다른 글
Linear regression의 cost 최소화의 tensorflow 구현 (0) | 2018.05.19 |
---|---|
Tensorflow로 간단한 linear regression을 구현 (0) | 2018.05.18 |
Linear Regression의 cost 최소화 알고리즘의 원리 (0) | 2018.05.09 |
Linear Regression의 개념 (1) | 2018.05.09 |
Machine Learning의 용어와 개념 설명 (1) | 2018.05.07 |