Tensorflow flatten vs numpy flatten功能对机器学习训练的影响

时间:2018-05-09 17:47:45

标签: python numpy tensorflow machine-learning keras

我开始使用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)

它在培训方面有何不同,哪种方法最佳?

4 个答案:

答案 0 :(得分:4)

  • 直接在数据上使用numpy,无需神经网络参与。这仅用于预处理和后处理
  • 如果模型中出于某种原因需要此操作,请在模型内使用TF或Keras图层。这将确保模型连接和适当的反向传播

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

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

现在,如果在模型中需要更改数据格式而不丢失连接和反向传播,那么请选择展平图层。

答案 1 :(得分:4)

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

所以我的建议非常简单:

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

答案 2 :(得分:1)

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

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

print(a.flatten().shape)

在前面的示例中,您最终获得了包含20个元素的1-d数组。 在张量流中,展平层(tf.layers.flatten)保留批轴(轴0)。在前面的示例中,使用tensorflow,您仍然可以使用(5,4)的形状。

在任何情况下,如果您以相同的方式使用展平,则对训练没有影响。但是,在使用tensorflow时应该避免使用numpy,因为几乎所有numpy操作都有其tensorflow对应物。 Tensorflow和numpy依赖于不同的运行时库,并且两者的结合可能是运行时效率低下的。

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

要在numpy和tensorflow之间进行更一般的性能比较,请看一下这个问题:Tensorflow vs. Numpy Performance

答案 3 :(得分:1)

<强>差分

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

<强>用法

如果这是训练过程中的一项操作,例如在进入下一层之前调整大小,则可以使用tensorflow操作。

当您想要在当时对实际值进行操作时,您将使用numpy op,例如在训练步骤结束时重新计算准确性。

所以如果你有一个

的任务

张量A - &gt;重塑 - &gt; matrix_mul

如果您使用 tensorflow 进行重塑,则可以直接运行会话中的matrix_mul

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

  1. 您计算张量A

  2. 你在numpy中重塑它。

  3. 通过&#34;喂养&#34;运行matrix_mul;重塑阵列。

  4. <强>性能

    我还没有对任何事情进行基准测试,但我只是说重塑操作是独立的,numpy会更快(忽略gpu),但在重塑是一个中间操作的过程中,张量流应该更快