2017-12-29 8 views
0

MonitoredTrainingSession을 사용해보고 싶지만 열차 및 유효성 검사 집합에 여러 개의 Dataset 개체도 사용합니다. 올바른 문자를 선택하려면 manual에서 문자열 핸들을 사용하는 것이 좋습니다. 그러나 훈련 중에 핸들을 feed_dict에 전달하려면 먼저 그것을 평가해야합니다. 이처럼 : 나는 MonitoredTrainingSession의 맥락에서이 작업을 수행 할 때MonitoredTrainingSession의 반복자 핸들 얻기

handle = sess.run(iterator.string_handle()) 

를, 나는 오류 얻을 : 내가 생각 같은 Scaffold 객체에 대한 init_fn을 만드는 것이 었습니다,

RuntimeError: Graph is finalized and cannot be modified. 

밖으로 방법을하는 나는 그 세션에 합격했다. 그러나 이것은 효과가 없었습니다. 문맥에서 앞서 언급 한 코드를 실행하려고하면 init_fn은 여전히 ​​같은 오류가 발생합니다. 문서로

init_fn 말한다 :

A callable to run after the init op to perform additional initializations.

이것은 제가이 콜백의 의도 된 목적에 근본적으로 틀렸다라고 생각한다, 또는 Tensorflow 무례한 행동.

이 혼란을 해결하도록 도와 주시겠습니까?

내 텐션 흐름 버전은 1.4.0입니다. 최소한의 예를 추가

UPDATE

. 첫 번째 블록은 작동하지만 두 번째 블록은 작동하지 않습니다.

import tensorflow as tf 

dataset_a = tf.data.Dataset.range(10) 
dataset_b = tf.data.Dataset.range(20, 25) 

input_handle = tf.placeholder(tf.string, shape=()) 
input_iterator = tf.data.Iterator.from_string_handle(
    input_handle, dataset_a.output_types, dataset_a.output_shapes) 

x = input_iterator.get_next() 
plus_one = tf.add(x, 1) 

with tf.Session() as sess: 
    iterator = dataset_b.make_initializable_iterator() 
    handle = sess.run(iterator.string_handle()) 
    sess.run(iterator.initializer) 

    res = sess.run(plus_one, feed_dict={input_handle: handle}) 
    print(res) 

with tf.train.MonitoredTrainingSession() as sess: 
    iterator = dataset_a.make_initializable_iterator() 
    handle = sess.run(iterator.string_handle()) 
    sess.run(iterator.initializer) 

    res = sess.run(plus_one, feed_dict={input_handle: handle}) 
    print(res) 
+0

[MCVE] (https://stackoverflow.com/help/mcve)를 제공 할 수 있습니까? –

답변

0

내 질문에 대한 답변을 찾았습니다. 그 아이디어는 핸들을 사용하는 것을 포기하고 대신에 (각 데이터 셋당) 여러 개의 이터레이터 이니셜 라이저를 생성해야한다는 것입니다. 로 볼 수

솔루션은 다음과 같다 : 데이터 집합 (this 부에서 예를 들어) 부가 데이터에 따라

import tensorflow as tf 

dataset_a = tf.data.Dataset.range(10) 
dataset_b = tf.data.Dataset.range(20, 25) 

input_handle = tf.placeholder(tf.string, shape=(), name='input') 
input_iterator = tf.data.Iterator.from_string_handle(
    input_handle, dataset_a.output_types, dataset_a.output_shapes) 

x = input_iterator.get_next() 
plus_one = tf.add(x, 1) 

with tf.Session() as sess: 
    iterator = dataset_b.make_initializable_iterator() 
    handle = sess.run(iterator.string_handle()) 
    sess.run(iterator.initializer) 

    res = sess.run(plus_one, feed_dict={input_handle: handle}) 
    print(res) 


iterator = dataset_a.make_initializable_iterator() 

iterator_init_op_a = iterator.make_initializer(dataset_a) 
iterator_init_op_b = iterator.make_initializer(dataset_b) 

x = iterator.get_next() 
plus_one = tf.add(x, 1) 

with tf.train.MonitoredTrainingSession() as sess: 
    sess.run(iterator_init_op_a) 
    res = sess.run(plus_one) 
    print(res) 
    res = sess.run(plus_one) 
    print(res) 
    sess.run(iterator_init_op_b) 
    res = sess.run(plus_one) 
    print(res) 
    res = sess.run(plus_one) 
    print(res) 

하면 I가 평가 될 때, I는 또한 iterator_init_op_a에 필요한 데이터를 공급할 수있다.