【问题标题】:Using datasets larger than 2 Gb with Keras在 Keras 中使用大于 2 Gb 的数据集
【发布时间】:2018-12-26 22:44:17
【问题描述】:

TensorFlow 在单个张量上具有 2 Gb 的长期限制。这意味着您无法一次在超过 2 Gb 的数据上训练您的模型,而无需费劲。见Initializing tensorflow Variable with an array larger than 2GBUse large dataset in Tensorflow

这些帖子中引用的标准解决方案是使用占位符并通过 feed_dict 将其传递给“会话”:

my_graph = tf.Graph()
sess = tf.Session(graph=my_graph)   
X_init = tf.placeholder(tf.float32, shape=(m_input, n_input))
X = tf.Variable(X_init)
sess.run(tf.global_variables_initializer(), feed_dict={X_init: data_for_X})

但是,这仅在我使用“旧”API(tf.Session() 等)时才有效。现在推荐的方法是使用 Keras(tensorflow.org 上的所有教程都使用它)。而且,对于 Keras,没有 tf.Graph()、tf.Session() 和 run()(至少没有一个对用户来说很容易看到。)

如何调整上述代码以使用 Keras?

【问题讨论】:

  • 你在 Keras 中没有这个问题,你真的尝试过训练一个 Keras 模型,看看你有没有问题?它使用完全不同的 API,所以我看不出问题出在哪里。
  • 我得到一个,“ValueError:无法创建内容大于 2GB 的张量原型。”在 tf.convert_to_tensor() 中,当我尝试将我的数据集从 numpy.ndarray 转换为张量时,我什至可以调用任何 Keras API 函数。如果我直接将数据作为 numpy.ndarray 提供给 Keras,它会在 Python 代码中成为瓶颈,GPU 利用率为 10%。
  • Keras 无法绕过 2GB 的限制。
  • 为什么需要转换成张量?这根本不需要,您只需制作一个生成器并使用 fit_generator 或如果您的数据适合 RAM,则直接使用 fit。确保调整批量大小以最大化性能。我已经使用 600 GB 数据集 (OpenImages) 训练了 Keras 模型,没有出现任何问题。

标签: python tensorflow keras


【解决方案1】:

在 Keras 中,您不会将整个数据集加载到张量中。您将其加载到 numpy 数组中。

如果整个数据可以在单个 numpy 数组中:

感谢@sebrockm 的评论。

Keras 最简单的用法是将数据集加载到 numpy 数组(不是 tf 张量)中并调用 model.fit(arrayWithInputs, arrayWithoutputs, ...)

如果整个数据不适合 numpy 数组:

您将创建一个 generatorkeras.utils.Sequence 来逐个加载批次,然后使用 model.fit_generator(generatorOrSequence, ...) 训练模型

限制成为批处理大小,但您几乎不会在单个批处理中达到 2GB。 所以,去吧:

【讨论】:

  • 但这需要在 Python 代码中创建批处理,这肯定是我们都想避免的事情?如果我有 2 GB 的数据要分成 1000 个批次,我想将整个 2 GB 交给 TF 并说“训练这个,分成 1000 个批次”。我不希望 TF 执行 1000 次 Python 调用来逐个提取批次,因为这在性能方面将是灾难性的。
  • @EugeneSmith 在 python 中批处理是我们经常做的事情,而且效果很好。至少在 Keras :)
  • @EugeneSmith 如果您的整个数据集只有 2GB,那么您根本不需要 fit_generator,只需 fit 就足够了(除非您只有 2GB 的总 RAM)。 fit_generator 仅在 整个 数据集(在将其分成批次之前)不适合 RAM 时才有用。
【解决方案2】:

Keras 对数据集没有 2GB 的限制,我已经使用 Keras 训练了更大的数据集,没有任何问题。

限制可能来自 TensorFlow 常量,它确实有 2GB 的限制,但在任何情况下,您都应该将数据集存储为常量,因为它们被保存为图表的一部分,即不是存储模型的想法。

Keras 具有model.fit_generator 函数,您可以使用该函数传递一个生成器函数,该函数动态加载数据并进行批处理。这允许您动态加载大型数据集,并且您通常会调整批量大小,以便在可接受的 RAM 使用情况下最大限度地提高性能。 TensorFlow 没有类似的 API,你必须像 feed_dict 所说的那样手动实现它。

【讨论】:

  • 我尝试使用比GPU内存大的完整TF数组,但失败了,出现以下错误(GPU中没有剩余空间):tensorflow.python.framework.errors_impl.InternalError: Failed copying input tensor from /job:localhost/replica:0/task:0/device:CPU:0 to /job:localhost/replica:0/task:0/device:GPU:0 in order to run _EagerConst: Dst tensor is not initialized.
  • @materialbug cmets to questions 并不是要问完全不同的问题,你应该问自己的问题
  • @materialbug 然后坚持你的问题,不要做不必要的 cmets。
猜你喜欢
  • 2020-06-27
  • 1970-01-01
  • 2018-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2016-02-17
相关资源
最近更新 更多