[英]Using batch size of one in tensorflow?
因此,我有一個模型,其中更新過程的理論依據依賴於批量大小為1.(對於那些好奇的,它被稱為推薦系統的貝葉斯個性化排名。)
現在,我編寫了一些標准代碼。 我的輸入是一個tf.placeholder
變量。 它是Nx3,我使用feed_dict
正常運行它。 如果我想要N,比如30K,那就完全沒問題了。 但是,如果我希望N為1,則feed_dict
開銷確實會降低我的代碼速度。
作為參考,我在純Python中手動實現漸變,並且它以大約70K iter /秒運行。 相比之下, GradientDescentOptimizer
以大約1K iter /秒的速度運行。 如你所見,這太慢了。 正如我所說,我懷疑問題是feed_dict
有太多的開銷來調用它的批量大小為1。
這是實際的session
代碼:
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for iteration in range(100):
samples = data.generate_train_samples(1000000)
for sample in tqdm(samples):
cvalues = sess.run([trainer, obj], feed_dict={input_data:[sample]})
print("objective = " + str(cvalues[1]))
有沒有更好的方法一次進行一次更新?
可能由於以下兩個原因,您的代碼運行速度會慢得多:
幸運的是Tensorflow有tf.data
API,有助於解決這兩個問題。 您可以嘗試執行以下操作:
inputs = tf.placeholder(tf.float32, your_shape)
labels = tf.placeholder(tf.floar32, labels_shape)
data = tf.data.Dataset.from_tensor_slices((inputs, labels))
iterator = dataset.make_initializable_iterator()
sess.run(iterator.initializer, {inputs: your_inputs, labels: your_labels})
然后從數據集中獲取下一個條目,您只需使用iterator.get_next()
如果這就是您所需要的,tensorflow有關於使用tf.data
API導入數據的詳盡文檔,您可以在其中找到適合您的用例: 文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.