본문 바로가기

Deep Learning/Keras & Tensorflow

MNIST 분류 모델, 조금 다르게 실행해보자 / get_tensor_by_name( )

320x100
320x100

 

 

 

일단 코드부터 보자.

 

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
29
30
31
32
33
34
35
36
37
38
39
40
41
import tensorflow ass tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('./mnist', one_hot = True)
 
= tf.placeholder(tf.float32, (None, 28,28,1), name = 'INPUT')
= tf.placeholder(tf.float32, (None, 10))
is_training = tf.placeholder(tf.bool)
 
L1 = tf.layers.conv2d(X, filters = 32, kernel_size = (3,3), strides = (1,1))
L1 = tf.layers.max_pooling2d(L1, pool_size = (2,2), strides = (2,2))
L1 = tf.layers.dropout(L1, 0.7, is_training)
 
L2 = tf.layers.conv2d(L1, filters = 64, kernel_size = (3,3), strides = (1,1))
L2 = tf.layers.max_pooling2d(L2, pool_size = (2,2), strides = (2,2))
L2 = tf.layers.dropout(L2, 0.7, is_training)
 
L3 = tf.contrib.layers.flatten(L2)
L3 = tf.layers.dense(L3, 256, activation = tf.nn.relu)
L3 = tf.layers.dropout(L3, 0.7, is_training)
 
model = tf.layers.dense(L3, 10, activation = None, name = 'TARGET_MODEL')
 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = model, labels = Y))
optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)
 
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
 
batch_size = 100
total_batch = int(mnist.train.num_examples / batch_size)
 
for epoch in range(1):
    total_cost = 0
    for i in range(total_batch):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        batch_x  = batch_x.reshape(-128281)
        
        _, cost_val = sess.run((optimizer, cost), feed_dict = {X : batch_x, Y : batch_y, is_training : True})
 
result = sess.run(model, feed_dict = {X : mnist.test.images.reshape(-1,28,28,1)})
cs

 

tensorflow공부한 사람이라면 거뜬히 이해할 수 있을 거다.

 

여기선 Line 5 와 Line 21 에 텐서 이름을 'INPUT' 과 'TARGET_MODEL' 로 직접적으로 설정해줬다는 것만 알아두고 넘어가자.


 

문든 이런 생각이 들었다.

 

default graph 에 추가된 operation들 중에 예측에 필요한 연산자만 뽑아내서 실행시켜줄 수 있는 방법은 없을까?

 

그래서 한 번 해봤다.

 

예측에 필요한 텐서는 두 개다.

 

  1. 데이터가 입력되는 입력 텐서

  2. 마지막 출력층에서 나오는 텐서

 

따라서 위의 코드에서는

 

  1. X = tf.placeholder( tf.float32, (None, 28, 28, 1), name = 'INPUT')

    X 의 이름은 'INPUT:0' 으로 잡힌다.

  2. model = tf.layers.dense( L3, 10, activation = None, name = 'TARGET_MODEL') 이 해당된다.
     
    model 의 이름은 'TARGET_MODEL/BiasAdd:0' 으로 잡힌다.       

default graph에서 가져와야하는 텐서를 쉽게 검색하기 위해 각 텐서의 이름을 'INPUT' 과 'TARGET_MODEL' 로 설정해주었다.

 

더보기

model =

tf.layers.dense(L3, 10, activation = None, name = 'TARGET_MODEL') 을 거치고나면

default graph에는 

tf.layers.dense 와 관련된 여러 오퍼레이션들이 추가된다.

 

그리고 그 중에서 가장 마지막 오퍼레이션의 이름이 TARGET_MODEL/BiasAdd 이고

 

해당 오퍼레이션에서 출력되는 텐서의 이름이 TARGET_MODEL/BiasAdd:0 이라서


model의 이름이 
TARGET_MODEL/BiasAdd:0 으로 잡히는 것이다.

 

그럼 이제 코드를 다시 봐보자.

 

43
44
45
46
47
48
49
50
51
52
53
54
55
graph = tf.get_default_graph()
input_tensor = graph.get_tensor_by_name('INPUT:0')
target_tensor = None
 
for op in graph.get_operations():
    for output in op.outputs:
        if 'TARGET_MODEL/BiasAdd:0' in output.name:
            target_tensor = graph.get_tensor_by_name(output.name)
 
result2 = sess.run(target_tensor, feed_dict = {input_tensor : mnist.test.images.reshape(-1,28,28,1)})
 
print(result[0== result2[0])
print(result[1== result2[1])Colored by Color Scripter
cs

 

  • Line 1
    : graph 변수가 default graph 를 가리키도록 설정한다.

  • Line 2
    : 입력 텐서를 가져온다. get_tensor_by_name( ) 으로 가져와 input_tensor 가 가리키도록 설정한다.

  • Line 5 ~ 8
    : default graph 에 추가된 operation들 중에 
      operation 의 output tensor 이름이 'TARGET_MODEL/BiasAdd:0' 인 것을 가져와 이를 target_tensor 가 가리키도록 설정한다.

      ※ op = 오퍼레이션, output = 텐서

  • Line 10
    : session을 통해 예측해준다.
      session에는 operation이 아닌 tensor를 입력해줘야하기 때문에 Line 2와 Line 8에서 텐서를 가져온 것이다.
      

result와 result2를 최종적으로 출력해서 확인해보면 두 결과가 같다는 걸 확인할 수 있다.