gpt4 book ai didi

python - 在 tensorflow 中使用一个批量大小?

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:20 25 4
gpt4 key购买 nike

因此,我有一个模型,其中更新过程的理论依据依赖于批量大小为 1。(对于那些好奇的人,它被称为推荐系统的贝叶斯个性化排名。)

现在,我已经编写了一些标准代码。我的输入是一个 tf.placeholder 变量。它是 Nx3,我使用 feed_dict 正常运行它。如果我希望 N 为 30K,这完全没问题。但是,如果我希望 N 为 1,feed_dict 开销确实会减慢我的代码速度。

作为引用,我在纯 Python 中手动实现了梯度,它的运行速度约为 70K iter/second。相比之下,GradientDescentOptimizer 的运行速度约为 1K iter/second。如您所见,这太慢了。正如我所说,我怀疑问题是 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. 只有在运行 session 时才将数据复制到 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 导入数据的详尽文档,您可以在其中找到适合您的用例:documentation

关于python - 在 tensorflow 中使用一个批量大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com