【问题标题】:Tensorflow flatten vs numpy flatten function effect on machine learning trainingTensorFlow flatten vs numpy flatten 函数对机器学习训练的影响
【发布时间】:2018-10-19 22:06:27
【问题描述】:

我开始使用 keras 和 tensorflow 进行深度学习。在第一阶段,我有一个疑问。当我使用tf.contrib.layers.flatten (Api 1.8) 来展平图像时(也可以是多通道)。

这与使用 numpy 中的 flatten 函数有何不同? 这对训练有什么影响。我可以看到 tf.contrib.layers.flatten 比 numpy flatten 花费的时间更长。是不是在做更多的事情?

这是very close question,但这里接受的答案包括 Theano,并不能完全解决我的疑问。

示例: 假设我有一个(10000,2,96,96) 形状的训练数据。现在我需要输出为(10000,18432) 形状。我可以使用 tensorflow flatten 或使用像

这样的 numpy flatten 来做到这一点
X_reshaped = X_train.reshape(*X_train.shape[:1], -2)

它对训练有什么影响?最佳实践是什么?

【问题讨论】:

  • 运行X_reshaped.print()会得到什么?
  • 嗨,(10000,18432)这是形状或X_reshape
  • 试图了解您的网络:您的训练形状(10000,2,96,96) 指的是(num_images, num_colourchannels, x_pixel, y_pixel),我说得对吗?在几个不同的场合,我看到了(num_images, x_pixel, y_pixel, num_colourchannels) 的形状。你的选择有影响吗?你是如何激励它的?谢谢!
  • 啊,你是对的。两者都是可能的。如果处理得当,它不会产生影响。这只是您的 keras 设置的问题。只需设置您的 keras.json 文件(在 /.keras 中)并将其设置为默认配置“channels_first”或“channels_last”。此设置将仅适用于您的机器。

标签: python numpy tensorflow machine-learning keras


【解决方案1】:

numpy 中的 flatten 函数会执行完整的数组展平,这意味着您最终会得到一个数据轴(仅 1 维)。 例如,

import numpy as np
a = np.arange(20).reshape((5,4))
print(a)

print(a.flatten().shape)

在前面的示例中,您最终得到一个包含 20 个元素的一维数组。 在 tensorflow 中,展平层(tf.layers.flatten)保留批处理轴(轴 0)。在前面的示例中,使用 tensorflow,您的形状仍然是 (5,4)。

无论如何,如果您以等效的方式使用 flatten,则对训练没有影响。但是,在使用 tensorflow 时应避免使用 numpy,因为几乎所有 numpy 操作都有对应的 tensorflow。 TensorFlow 和 numpy 依赖于不同的运行时库,将两者结合起来可能会导致运行时效率低下。

此外,当 contrib 包层已经存在于主包中时,请避免使用它们(使用 tf.layers.flatten 而不是 tf.contrib.layers.flatten)。

有关 numpy 和 tensorflow 之间更一般的性能比较,请查看以下问题:Tensorflow vs. Numpy Performance

【讨论】:

  • 对于答案,特别是链接和关于不使用 contrib 包的建议 +1
【解决方案2】:
  • 直接在您的数据上使用 numpy,无需神经网络的参与。这仅用于预处理和后处理
  • 如果模型中出于某种原因需要此操作,请在模型中使用 TF 或 Keras 层。这将确保模型连通性和正确的反向传播

模型是用于创建可训练的神经网络的符号图。当您有一个从输入到输出的连接图时,将有一个正确的连接并且反向传播将正常工作。

如果您不打算创建网络,请不要使用 TF 层。如果您的目标只是展平数组,则不需要神经网络。

现在,如果在模型内部您需要在不丢失连接和反向传播的情况下更改数据格式,那么请使用 flatten 层。

【讨论】:

  • 谢谢丹尼尔的回答,这让我对这两种方式的使用案例有了进一步的澄清。我现在清楚地看到,它们旨在用于培训过程的两个不同阶段。 +1。感谢您对tf flatten方面的符号图解释的解释。
【解决方案3】:

np.flatten 和tf.layers.flatten(或tf.contrib.layers.flatten)之间的最大区别在于numpy 操作仅适用于静态nd 数组,而tensorflow 操作可以使用动态张量。在这种情况下,动态意味着只有在运行时(训练或测试)才能知道确切的形状。

所以我的建议很简单:

  • 如果输入数据是静态 numpy 数组,例如在预处理中,使用np.flatten。这避免了不必要的开销并返回 numpy 数组。
  • 如果数据已经是张量,请使用张量流提供的任何flatten 操作。在这两者之间,tf.layers.flatten 是更好的选择,因为tf.layers API 比tf.contrib.* 更稳定。

【讨论】:

  • 感谢您的回答。如果我能接受多个答案,我也会接受丹尼尔的答案,但我接受这个答案,因为这从动态形状方面给出了这个想法。这是 tensorflow flatten 的一个明显优势。起初我无法朝这个方向思考。 +1
【解决方案4】:

区别

当您使用 tensorflow flatten 时,它会作为操作 (op) 添加到图中。它只能在张量上运行。另一方面,Numpy 适用于实际的 numpy 数组。用法完全不同。

用法

如果这是训练过程中的操作,例如在馈送到下一层之前调整大小,您将使用 tensorflow op。

当您想要对当时的实际值进行操作时,您可以使用 numpy op,例如在训练步骤结束时进行整形以计算准确度。

如果你有一个任务

张量 A -> 重塑 -> matrix_mul

如果你使用 tensorflow 进行重塑,你可以直接运行来自会话的matrix_mul。

但是,如果您使用 numpy,则必须在 两个阶段(两个会话调用)中运行该操作。

  1. 你计算张量A

  2. 你在 numpy 中重塑它。

  3. 通过在重构后的数组中“馈送”来运行 matrix_mul。

性能

我没有对任何东西进行基准测试,但我想说的是,对于独立的 reshape 操作,numpy 会更快(忽略 gpu),但在 reshape 是中间操作的过程中,tensorflow 应该更快。

【讨论】:

  • 感谢您以结构化的方式解释差异、用法和性能。 +1。在性能方面,我的经验证实了您在 numpy 方面的解释。但我认为张量流总是需要更长的时间。
猜你喜欢
  • 2011-02-15
  • 1970-01-01
  • 2017-06-25
  • 2017-04-06
  • 1970-01-01
  • 2020-06-15
  • 2020-02-21
  • 2022-11-28
  • 2020-05-06
相关资源
最近更新 更多