2017-10-18 125 views
4

對於我的項目,我有大量的數據,大約60GB傳入npy文件,每個文件大約有1GB,每個文件包含大約750k個記錄和標籤。如何在張量流中處理大量的數據?

每個記錄是345個float32,標籤是5個float32。

我讀了tensorflow數據集文檔和隊列/線程文檔,但我無法弄清楚如何最好地處理輸入的訓練,然後如何保存模型和權重以備未來預測。

我的模型是非常簡單的,它看起來像這樣:

x = tf.placeholder(tf.float32, [None, 345], name='x') 
y = tf.placeholder(tf.float32, [None, 5], name='y') 
wi, bi = weight_and_bias(345, 2048) 
hidden_fc = tf.nn.sigmoid(tf.matmul(x, wi) + bi) 
wo, bo = weight_and_bias(2048, 5) 
out_fc = tf.nn.sigmoid(tf.matmul(hidden_fc, wo) + bo) 
loss = tf.reduce_mean(tf.squared_difference(y, out_fc)) 
train_op = tf.train.AdamOptimizer().minimize(loss) 

我在訓練我的神經網絡的方式是按隨機順序讀取文件一次一個然後用洗好的一numpy的數組索引每個文件並手動創建每個批次以使用feed_dict來提供train_op。從我讀的所有內容來看,效率非常低,我應該用數據集或隊列和線程來替換它,但正如我所說的那樣,文檔沒有任何幫助。

那麼,在張量流中處理大量數據的最佳方法是什麼?

另外,作爲參考,我的數據被保存到文件numpy的以2的操作步驟:

with open('datafile1.npy', 'wb') as fp: 
    np.save(data, fp) 
    np.save(labels, fp) 
+0

這可能正是你正在尋找的:[導入數據(使用'數據集'API)](https://www.tensorflow.org/programmers_guide/datasets) –

+0

對於大數據集,你不應該通過所有的它立即。使用小批量來克服這一點。但在此之前,不要把所有東西都放在記憶中。使用小批量。 –

+0

Karhy,我讀過數據集文檔,但大部分似乎都假設數據已預先加載到內存中。 Paramdeep,我正在使用迷你批處理,這就是我如何從numpy文件加載數據,然後在後來對數據進行混洗並手動進行迷你批處理以提供x和y佔位符。這就是我想要弄清楚如何以更有效的方式做到的。 –

回答

0

公用事業爲npy文件存儲器確實分配整個陣列。我建議你將所有numpy陣列轉換爲TFRecords format並在培訓中使用這些文件。這是讀取張量流中大數據集的最有效方法之一。

轉換爲TFRecords

def array_to_tfrecords(X, y, output_file): 
    feature = { 
    'X': tf.train.Feature(float_list=tf.train.FloatList(value=X.flatten())), 
    'y': tf.train.Feature(float_list=tf.train.FloatList(value=y.flatten())) 
    } 
    example = tf.train.Example(features=tf.train.Features(feature=feature)) 
    serialized = example.SerializeToString() 

    writer = tf.python_io.TFRecordWriter(output_file) 
    writer.write(serialized) 
    writer.close() 

一個完整的例子,處理與圖像可以是found here

TFRecordDataset

def parse_proto(example_proto): 
    features = { 
    'X': tf.FixedLenFeature((345,), tf.float32), 
    'y': tf.FixedLenFeature((5,), tf.float32), 
    } 
    parsed_features = tf.parse_single_example(example_proto, features) 
    return parsed_features['X'], parsed_features['y'] 

def read_tfrecords(file_names=("file1.tfrecord", "file2.tfrecord", "file3.tfrecord"), 
        buffer_size=10000, 
        batch_size=100): 
    dataset = tf.contrib.data.TFRecordDataset(file_names) 
    dataset = dataset.map(parse_proto) 
    dataset = dataset.shuffle(buffer_size) 
    dataset = dataset.repeat() 
    dataset = dataset.batch(batch_size) 
    return tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes) 

數據手冊可以是found here