MNIST 분류 문제를 공부할 때만 해도 사용법 익히기에 급급했기 때문에 tensorflow를 제대로 이해하고 다루진 않았었다.
일반적인 파이썬 코드 구현하고는 다르게
tensorflow는 계산 그래프에 노드( = 연산, 계산, 오퍼레이션 )을 추가하고 session을 통해 실행해줘야 하는 구조라고만 이해하고 넘겼다.
tf.placeholder( ), tf.layers.conv2d( ), tf.train.AdamOptimizer( )와 같은 함수들로 계산 그래프를 그려가며 모델을 설계하고,
tf.Session( ).run( )으로 그려진 계산 그래프를( = 설계된 모델을 ) 실제로 실행하는 구조라고만 이해했었다.
+ X = tf.placeholder( tf.float32, None) 의 경우,
X는 tf.placeholder( ) 가 계산 그래프에 등록하는 operator의 output tensor 를 가리킨다는 것
+ sess.run( )에는 텐서를 넣어주고, Session은 입력된 텐서와 연결된 오퍼레이션을 실행하는 구조라는 것
뭐 틀린 말은 아니었고 이것만 알고있어도 코딩하는데는 큰 어려움이 없었다.
그러다 어떤 흐름을 갖는 건지 제대로 확이해야할 필요가 생겨서 좀 더 공부해봤다.
지금도 아직은 아리송한 느낌이 있지만.. 지금까지 공부하며 깨우친 걸 일단 글로 남겨보고자 한다.
tensorflow를 import 하면 자동으로 default graph 가 생성된다.
그리고 default graph는 tf.get_default_graph( ) 로 받아줄 수 있다.
모델 설계에 사용하는 tf.placeholder( ), tf.layers.conv2d( ) 와 같은 함수들은
오퍼레이션의 output tensor를 반환하며 내부적으로는 계산 그래프에 오퍼레이션을 추가한다.
X는 tf.placeholder( )가 반환한 output tensor를 가리키고, default graph에는 operator들이 추가된 걸 확인할 수 있다.
X가 가리키고 있는 output tensor는 내부함수를 통해 해당 텐서를 내뱉은 operator로 접근할 수 있다.
그리고 default graph에 추가된 operator들은 get_operations( ) 함수로 불러올 수 있다.
이 둘을 X.op is op 로 확인해보면 같다는 결과를 얻을 수 있다.
마찬가지로 tensor도 불러올 수 있고 이 역시 같은 지 확인해 줄 수 있다
op.outputs 으로 해당 operator의 output tensor를 받아올 수 있다.
알아둘 점은 tf.layers.conv2d( ) 와 같은 함수들은 tf.placeholder( ) 와 같이 하나의 operation만 추가하는 게 아니라
관련된 operation들을 모두 추가한다는 점이다.
그리고 파이썬 변수 conv 에는 최종적으로 출력되는 tensor 가 반환되게 된다.
여기서는 conv2d/BiasAdd 의 output tensor가 되겠다.
X = tf.placeholder(tf.float32, (None, 28, 28, 1), name = 'INPUT') 에서 name으로 설정해주는 대상은
사실 텐서가 아니라 텐서와 연결된 오퍼레이션이다.
X.name 에서 INPUT 뒤에 붙는 ' : 0 ' 은 output tensor의 index에 해당한다.
이름이 INPUT인 오퍼레이션은 텐서를 원소로 담고있는 리스트를 반환하는데,
이들 중 index = 0 에 담겨있는 텐서가 X 라는 말이다.
흐름을 정리하면 아래 그림과 같다.
< 참고 사이트 >
https://dohkstalks.blogspot.com/2017/01/tensorflow-concept-tensorflow.html
https://webnautes.tistory.com/1182
https://webnautes.tistory.com/1227?category=754886
https://excelsior-cjh.tistory.com/151?category=940399
'Deep Learning > Keras & Tensorflow' 카테고리의 다른 글
ImgaeDataGenerator.flow_from_directory을 이용해 이미지 증식하는 방법 (0) | 2021.08.31 |
---|---|
keras.models.Model( ) (0) | 2021.08.31 |
MNIST 분류 모델, 조금 다르게 실행해보자 / get_tensor_by_name( ) (0) | 2021.08.31 |
RNN과 CNN 동시 사용 모델(RCNN / CRNN)의 개념 및 구현 (0) | 2021.08.31 |
tf.gfile.GFile( )은 무엇일까 (2) | 2019.07.03 |