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)
X = tf.placeholder(tf.float32, (None, 28,28,1), name = 'INPUT')
Y = 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(-1, 28, 28, 1)
_, 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들 중에 예측에 필요한 연산자만 뽑아내서 실행시켜줄 수 있는 방법은 없을까?
그래서 한 번 해봤다.
예측에 필요한 텐서는 두 개다.
- 데이터가 입력되는 입력 텐서
- 마지막 출력층에서 나오는 텐서
따라서 위의 코드에서는
- X = tf.placeholder( tf.float32, (None, 28, 28, 1), name = 'INPUT')
X 의 이름은 'INPUT:0' 으로 잡힌다. - model = tf.layers.dense( L3, 10, activation = None, name = 'TARGET_MODEL') 이 해당된다.
model 의 이름은 'TARGET_MODEL/BiasAdd:0' 으로 잡힌다.
default graph에서 가져와야하는 텐서를 쉽게 검색하기 위해 각 텐서의 이름을 'INPUT' 과 'TARGET_MODEL' 로 설정해주었다.
더보기
default graph에는
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])
|
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를 최종적으로 출력해서 확인해보면 두 결과가 같다는 걸 확인할 수 있다.
'Deep Learning > Keras & Tensorflow' 카테고리의 다른 글
ImgaeDataGenerator.flow_from_directory을 이용해 이미지 증식하는 방법 (0) | 2021.08.31 |
---|---|
keras.models.Model( ) (0) | 2021.08.31 |
RNN과 CNN 동시 사용 모델(RCNN / CRNN)의 개념 및 구현 (0) | 2021.08.31 |
Tensorflow 개념 정리) 텐서, 변수, 오퍼레이션, 계산 그래프 (0) | 2021.08.31 |
tf.gfile.GFile( )은 무엇일까 (2) | 2019.07.03 |