2016-10-19 64 views
2

我正致力於分類簡歷中的多類分類問題。Pickled scipy稀疏矩陣作爲輸入數據?

我使用sklearn和它的TfIdfVectorizer來獲得一個大的scipy稀疏矩陣,它在酸洗後喂入Tensorflow模型。在我的本地機器上,我加載它,將一個小批量轉換爲密集的numpy數組並填充一個饋送詞典。一切都很好。

現在我想在ML雲上做同樣的事情。我的泡菜保存在gs://my-bucket/path/to/pickle,但是當我運行我的教練時,無法在此URI(IOError: [Errno 2] No such file or directory)處找到泡菜文件。我正在使用pickle.load(open('gs://my-bucket/path/to/pickle), 'rb')來提取我的數據。我懷疑這不是在GCS上打開文件的好方法,但我對Google Cloud完全不熟悉,並且找不到正確的方法。

此外,我讀了一個必須使用TFRecords或CSV格式的輸入數據,但我不明白爲什麼我的方法無法正常工作。不包括CSV,因爲矩陣的密集表示將太大而不適合內存。 TFRecords可以像這樣有效地編碼稀疏數據嗎?是否有可能從一個pickle文件讀取數據?

回答

5

你是正確的,Python的「開放」將無法與GCS開箱即用。考慮到您使用的是TensorFlow,您可以使用file_io庫,它可以與本地文件以及GCS上的文件一起使用。

from tensorflow.python.lib.io import file_io 
pickle.loads(file_io.read_file_to_string('gs://my-bucket/path/to/pickle')) 

注意:pickle.load(file_io.FileIO('gs://..', 'r'))似乎不起作用。

歡迎您使用適用於您的任何數據格式,並且不限於CSV或TFRecord(您是否指向提供該聲明的文檔中的位置?)。如果數據適合內存,那麼你的方法是明智的。

如果數據不適合內存,您可能需要使用TensorFlow的reader framework,其中最方便的是CSV或TFRecords。 TFRecord只是一個字節串的容器。最常見的是,它包含支持稀疏數據的序列號tf.Example數據(它基本上是一張地圖)。有關解析tf.Example數據的更多信息,請參閱tf.parse_example

+0

感謝您的詳細解答,儘快嘗試您的解決方案!我調查了TFRecords,但我不確定如何將其用於稀疏數據。我明白對於像mnist這樣的密集數組,您可以將784維數組編碼爲每個示例的一個特徵。我想對於稀疏數據,我需要單獨編碼每個功能,並在數據丟失時設置默認值(0)。我對嗎? –

+0

有多種方法可以對稀疏數據進行編碼。你想要編碼什麼? – rhaertel80