繁体   English   中英

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

[英]Tensorflow flatten vs numpy flatten function effect on machine learning training

我开始使用keras和tensorflow深入学习东西。 在第一阶段,我感到疑惑。 当我使用tf.contrib.layers.flatten (Api 1.8)来平滑图像时(也可以是多通道)。

这与使用numpy的flatten函数有什么不同? 这对培训有何影响。 我可以看到tf.contrib.layers.flatten比numpy flatten需要更长的时间。 它正在做更多的事情吗?

这是一个非常接近的问题,但这里接受的答案包括Theano并没有完全解决我的疑虑。

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

X_reshaped = X_train.reshape(*X_train.shape[:1], -2)

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

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

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

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

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

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

所以我的建议非常简单:

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

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

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

print(a.flatten().shape)

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

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

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

有关numpy和tensorflow之间更一般的性能比较,请看一下这个问题: Tensorflow与Numpy性能

区别

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

用法

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

当你想在那时操作实际值时,你会使用numpy op,比如在训练步骤结束时重新计算准确性。

所以,如果你有任务

张量A - >重塑 - > matrix_mul

如果使用tensorflow进行重塑,则可以直接从session 运行 matrix_mul

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

  1. 你计算张量A.

  2. 你在numpy中重塑它。

  3. 通过重新形成的数组中的“进给”运行matrix_mul。

性能

我没有基准测试任何东西,但我只是说重塑操作是独立的,numpy会更快(忽略gpu),但在重塑是一个中间操作的过程中,tensorflow应该更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM