- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为可变大小的输入(相对于固定大小的输入)创建 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/
我是一名优秀的程序员,十分优秀!