gpt4 book ai didi

tensorflow - 为可变大小的输入和固定大小的输入创建 TensorFlow 占位符有什么缺点吗?

转载 作者:行者123 更新时间:2023-12-03 00:41:16 36 4
gpt4 key购买 nike

我想知道为可变大小的输入(相对于固定大小的输入)创建 TensorFlow 占位符是否有任何实质性的缺点(例如,关于计算效率、内存......)?

假设我正在进行小批量学习,并使用占位符初始化图表,其中我假设预先固定了batch_size:

tf.placeholder(..., shape=[batch_size, ...])

或者,我可以初始化占位符变量,以便它接受可变大小的输入:

tf.placeholder(..., shape=[None, ...])

我不太熟悉底层的 tensorflow 实现,但是后者是否必须在每次迭代时检查尺寸、分配内存并创建新数组,以考虑到我的小批量大小在期间发生变化的情况训练?因此,根据实现的不同,如果我使用固定的批量维度,这在计算上是否会造成浪费?

最佳答案

提供完全定义的形状(这可以产生更好的性能)和允许维度变化(这使得数据流图更容易重用)之间存在一定的张力。正如您所怀疑的,使用可变形状 tf.placeholder() 有一些缺点表示 TensorFlow 模型中输入的操作:

  • 当形状完全已知时,TensorFlow 通常能够简化数据流图。例如,调用tf.shape(x)返回一个包含张量 x 的真实动态形状的 tf.Tensor。如果在图构建时完全定义了该形状,TensorFlow 将用 tf.constant() 替换形状计算。 ,这将用于不断的折叠优化,以减少运行时完成的工作量。

  • 作为一个极端的例子,XLA compiler要求在生成代码之前完全定义所有输入张量形状,以便它可以生成更高效的内核代码,其中数组边界(等)是编译时常量。 XLA 会针对每个输入形状组合重新编译内核代码,因此使用固定大小的张量将避免重新编译开销。

  • TensorFlow 的内存分配器目前确实在每次调用 tf.Session.run() 时为每个中间和输出张量分配新数组。然而,底层内存分配器(GPU 内存的 BFC 分配器以及 CPU 内存的 tcmalloc 或 jemalloc)如果具有分配请求的静态分配,往往会表现得更好(因为可以从最近释放的缓冲区来满足请求)。

关于tensorflow - 为可变大小的输入和固定大小的输入创建 TensorFlow 占位符有什么缺点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42547456/

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