2017-12-29 5 views
0

私はMonitoredTrainingSessionを試してみたいと思いますが、電車と検証セットにはいくつかのDatasetオブジェクトも使用しています。正しい文字列を選択するには、manualは文字列ハンドルを使用することを示唆しています。しかし、トレーニング中にハンドルをfeed_dictに渡すには、まずそれを評価する必要があります。このように:MonitoredTrainingSessionでイテレータハンドルを取得する

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

しかし、私はMonitoredTrainingSessionの文脈でこれを行うとき、私はエラーを取得:

RuntimeError: Graph is finalized and cannot be modified. 

道うち、私が思ったとして、そのScaffoldオブジェクトに対してinit_fnを作成することでした私はセッションに入る。しかし、これはうまくいかなかった。私が文脈で上記のコードを実行しようとすると、init_fnはまだ同じエラーが発生します。ドキュメントとして

init_fnについてこう述べています。

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

これは私が、私はこのコールバックの使用目的と根本的に間違っている、またはTensorflowが誤動作することを考えさせます。

この混乱を解決するお手伝いをしてください。

私のテンソルフローバージョンは1.4.0です。最小の例を追加

UPDATE

。最初のブロックは機能し、2番目のブロックは機能しません。

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

私の質問に対する回答が見つかりました。アイデアは、ハンドルを使用することをあきらめ、代わりに(各データセットごとに)複数のイテレータイニシャライザを作成することです。次のように

溶液を見ることができ:

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) 

データセットが(thisセクションでとして)追加のデータに依存する場合、私は、さらに私はそれを評価する際に、iterator_init_op_aに必要なデータを供給することができます。

関連する問題