2017-05-23 23 views
0

我創建了一個tfrecords文件,我通過tf.TFRecordReader讀取了這個文件,它非常適合培訓網絡。但是,我不知道如何動態地減少批量進行生產,也沒有如何餵養,並覆蓋有tf.train.import_meta_graph如何使依賴於tf.train.shuffle_batch準備生產的網絡

reader = tf.TFRecordReader() 
data = tf.train.shuffle_batch(...) 
# batch_size 100 

IS_TRAINING = tf.placeholder(tf.bool, shape=(), name="is_training") 
# tried constant, variable and placeholder with no luck 

custom_data = tf.Variable(...) 

_data = tf.cond(
    IS_TRAINING, 
    lambda: data, 
    lambda: custom_data, 
    name="condition" 
) 

coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(coord=coord, sess=sess) 

# network graph 

coord.request_stop() 
coord.join(threads) 

sess.close() 

我試着加載圖形與tf.train.import_meta_graph導入培訓的圖形時,一些變量,使用feed_dict,嘗試覆蓋IS_TRAINING,所以圖表使用的數據也是我通過feed_dict提供的。但迄今爲止沒有任何工作。

例如

sess.run([variable], feed_dict={IS_TRAINING:False, custom_data:data}) 
+1

導入元圖只是爲您提供了模型的圖形定義(類似於解析和導入PB文件的效果),以​​及其他一些東西,比如您的保存。我相信meta_graph的導入與你的tfrecord管道相當不同。您可以考慮使用數據集類來讀取您的TFRecord文件,因爲它們將並行讀取您的數據並默認進行隨機播放,從而爲您提供更清晰的代碼。你可以考慮構建一個簡單地用「真」或「假」來改變模型作爲評估或訓練模型的模型。 – kwotsin

回答

1

如果你正在加載數據,而不是手動從TF記錄文件,你會想杜絕使用QueueRunner加載樣本(如果您使用的是tensorflow記錄讀者裝載樣品僅用於),而是加載數據sess.run([ops], feed_dict={data:my_custom_data})

更改模型不使用洗牌批了,這不應該影響您的加載關卡能力:

data = tf.placeholder(tf.float32, shape=(input_shape), name="data") 

它會更容易只是改變模型寧比使用條件分配正如你所示。但是如果你想使用條件語句,那麼custom_data應該是一個佔位符,而不是一個變量。

如果你希望你的代碼在兩種情況下工作,我會在你定義圖形的地方使用python if語句,而不是在圖形運行時。

+0

感謝您的回覆!爲了訓練,我使用了一個'tfRecord'文件。但事實上,我不需要將它用於生產。不知道如何與'tf.train.import_meta_graph'一起工作? – totoislost

+1

好問題,這可能是一個問題。不要導入元圖,只需重新運行以編程方式構建圖的代碼,然後恢復應該在任一圖上起作用,因爲只有OPS而不是變量發生了變化。 –

+1

你上面的評論有正確的想法。更多細節[here](https://stackoverflow.com/questions/43708616/tensorflow-inference) – totoislost