2017-10-12 88 views
3

我正在使用tensorflow的dataset API。並用簡單的情況測試我的代碼。下面顯示了我使用的簡單代碼。問題是,當數據集大小很小時,似乎來自數據集API的返回大小不一致。我確信有一個適當的方法來處理它。但即使我閱讀了該頁面和教程中的所有功能,但我無法找到它。tensorflow的數據集API的返回大小不是常數

import numpy as np 
import tensorflow as tf 

data_source = tf.zeros([24, 200, 64, 64, 1]) #[number_of_video, steps, pixel_w, pixel_h, channel] 
dataset = tf.contrib.data.Dataset.from_tensor_slices(data_source) 
dataset = dataset.shuffle(buffer_size=100) 
dataset = dataset.batch(16) 
dataset = dataset.repeat() 

iterator = tf.contrib.data.Iterator.from_structure(dataset.output_types, dataset.output_shapes) 
next_element = iterator.get_next() 
training_init_op = iterator.make_initializer(dataset) 

with tf.Session() as sess: 
    sess.run(training_init_op) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 
    next_elem = next_element.eval() 
    print(np.shape(next_elem)) 

該數據集是灰度視頻。共有24個視頻序列,步長爲200.幀大小爲64乘64,單通道。我設置批量大小爲16和緩衝區大小爲100,但該代碼的結果是,

(16, 200, 64, 64, 1) 
(8, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(8, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(8, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 

視頻的返回的大小是16或8。我想這是因爲原來的數據尺寸小, 24,當它到達數據的末尾時,API只返回剩下的內容。

但我不明白。我還將緩衝區大小設置爲100.這意味着緩衝區應該預先填充小數據集。並從該緩衝區中,API應選擇批量大小爲16的next_element。

當我在tensorflow中使用隊列類型API時,我沒有這個問題。無論原始數據的大小如何,無論如何,迭代器到達數據集的末尾時都會有一個時刻。我想知道這個問題是如何被其他使用這個API的人解決的。

回答

2

嘗試調用repeat()batch()

data_source = tf.zeros([24, 200, 64, 64, 1]) #[number_of_video, steps, pixel_w, pixel_h, channel] 
dataset = tf.contrib.data.Dataset.from_tensor_slices(data_source) 
dataset = dataset.shuffle(buffer_size=100) 
dataset = dataset.repeat() 
dataset = dataset.batch(16) 

結果我得到:

(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1) 
(16, 200, 64, 64, 1)