2016-07-07 46 views
0

我正在進行音頻序列學習,需要加載音頻數據。目前,我依靠tf.decode_csv將一對文件名和標籤加載到Tensorflow隊列中。但是,我然後想要真正閱讀該文件並使用其他Python庫進行處理。然而,CSV解碼器/出列操作總是返回張量操作,因此不可能與其他Python庫進行互操作。有關如何將TF流操作與外部庫混合的任何想法?使用常規Python混合隊列操作以進行數據加載

file_path = tf.train.string_input_producer([csv_path]) 
reader = tf.TextLineReader() 
_, csv_content = reader.read(file_path) 

decode_op = tf.decode_csv(csv_content, record_defaults=[[""], [0]]) 
enqueue_ops.append(examples_queue.enqueue(decode_op)) 

tf.train.queue_runner.add_queue_runner(
    tf.train.queue_runner.QueueRunner(examples_queue, enqueue_ops)) 
... 
sound_path, label_index = examples_queue.dequeue() <--- !!!! 
data = read_wav(sound_path) 

sound_path是D型string張量,但我無法真正施​​展/它轉換成一個Python字符串與read_wav LIB兼容性。

任何想法?

回答

3

讓我們假設你的read_wav函數期望一個文件名(字符串)作爲參數,並返回浮點值的numpy的陣列(解碼文件)。

read_wav的計算髮生在張量流圖之外的python中。您可以使用tf.py_func將Python代碼封裝到TensorFlow封裝器中,而不是調用sess.run(sound_path),這會創建大量運行(每個文件名一個)。您需要指定輸出的類型爲tf.py_func。您的函數需要將numpy數組作爲輸入並返回numpy數組。

def your_function(sound_path): 
    sound_path = sound_path[0] 
    data = read_wav(sound_path) # should be a numpy array 
    return data 
+0

我不知道'tf.py_func':O優秀答案,+1 – nessuno

+0

是的,它是添加自定義操作的最簡單方法,但它只能在CPU上計算(所以如果數據需要從GPU傳輸數據它) –

+0

即使我將函數封裝爲'tf.py_func',輸入參數仍然是一個CSVDecode張量。如何「投射」成一個字符串?在操作/功能定義時,尚未啓動會話。換句話說,輸入參數不是一個numpy數據類型。 – Tom

0

要提取張量的內容,必須將其「運行」到會話中。

sound_path_value = sess.run(sound_path)

+0

我不明白的是爲什麼它在上述調用時尚未運行。我的設置如下: 定義的DataLoader - >設置爲輸入到CONV層 - >添加到模型優化器 - >'sess.run(優化)' 現在,的DataLoader是第一件事,被定義爲。如果使用純張量運算,它們將作爲佔位符,直到在主要訓練循環中評估sess.run爲止,並且一切正常。 換句話說,數據加載器是在任何模型,優化器或會話實例化之前定義的。 – Tom

相關問題