簡體   English   中英

在張量流中使用一個批量大小?

[英]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]))

有沒有更好的方法一次進行一次更新?

可能由於以下兩個原因,您的代碼運行速度會慢得多:

  1. 只有在運行會話時才將數據復制到GPU內存(如果使用GPU)並且多次執行(這非常耗時)
  2. 你在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM