2016-10-18 53 views
2

我是TensorFlow的新手,在閱讀數據的過程中遇到了一些問題。我在mnist數據上設置了一個TensorFlow圖表,但我想修改它,以便我可以運行一個程序來訓練它+保存模型,然後運行另一個程序來加載所述圖形,進行預測並計算測試精度。將單個示例提供給在文件上訓練的TensorFlow圖形?

如果我感到困惑的是如何繞過訓練圖中的原始I/O系統,並「注入」一個圖像來預測測試數據的元組(圖像,標籤)以進行精度測試。要閱讀訓練數據,我正在使用此代碼:

_, input_data = util.read_examples(
    paths_to_files, 
    batch_size, 
    shuffle=shuffle, 
    num_epochs=None) 

feature_map = { 
    'label': tf.FixedLenFeature(
    shape=[], dtype=tf.int64, default_value=[-1]), 
    'image': tf.FixedLenFeature(
    shape=[NUM_PIXELS * NUM_PIXELS], dtype=tf.int64), 
} 
example = tf.parse_example(input_data, features=feature_map) 

然後我將示例饋送到卷積層等,並生成輸出。

現在想象一下,我用指定輸入的代碼來訓練我的圖形,保存圖形和權重,然後在另一個腳本中恢復圖形和權重以進行預測 - 我想拍攝(比如)10張圖像並將它們饋送到圖表以生成預測。我如何「注入」這10幅圖像,以便預測從另一端出來?

我玩過飼料字典和佔位符,但我不確定它們對我來說是否是正確的東西......似乎他們依靠內存中的數據,而不是從數據庫中讀取數據例如測試數據的隊列。

謝謝!

回答

0

如果您想執行少量的推理/評估(即足以放入內存),則帶有佔位符的Feed字典會很有意義 - 例如,如果你正在服務一個簡單的模型或運行小的eval循環。

如果您特別想推斷或評估大批量,那麼您應該使用您用於培訓的相同方法,但使用與您的測試/評估/實時數據不同的路徑。例如

_, eval_data = util.read_examples(
    paths_to_files, # CHANGE THIS BIT 
    batch_size, 
    shuffle=shuffle, 
    num_epochs=None) 

你可以使用它作爲一個普通的python變量,並設置連續的相關步驟來使用它作爲提供的變量。例如

def get_example(data): 
    return tf.parse_example(data, features=feature_map) 

sess.run([get_example(path_to_your_data)]) 
+0

好酷,這是有道理的。我在加載我的圖表時遇到了麻煩,這是如何工作的 - 原始的util.read_examples節點位於該圖表的某個位置,我不得不以某種方式繞過或修改它。是最簡單的事情只是重新排列我的圖表,刪除它並添加一個新的飼養節點? – user358829

+0

Ahh--通常會爲推理和訓練構建稍微不同的圖形,但我認爲最簡單的解決方案是使用相同的圖形,但在推理時提供Feed詞典。您可以將想要替換的張量作爲字典中的關鍵字,並將該張量所需的值作爲值傳遞。我想在你的例子中你可以使用'sess.run([your_inference_tensors],{example ['image']:your_image_data})'。爲了更加清晰,請檢查[Session.run()](https://www.tensorflow.org/versions/r0.11/api_docs/python/client.html#Session.run)文檔。 –