Tensorflow中的flatten函数和numpy中的flatten函数对机器学习训练的影响有何不同?

6
我正在使用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)

什么是训练的差异,哪种方式最佳实践?

当你运行 X_reshaped.print() 时,你会得到什么? - Mohammad Athar
嗨,(10000,18432) 这是形状或 X_reshaped。 - Arka Mallick
试图了解您的网络:我理解您的训练形状(10000,2,96,96)是指(图像数量,颜色通道数,x像素,y像素),对吗?在几个不同的场合,我看到过形状为(图像数量,x像素,y像素,颜色通道数)的情况。您的选择有什么区别,您是如何激励自己做出这个选择的呢?谢谢! - NeStack
啊,你说得对。两种方式都是可行的。只要正确处理,就没有区别。这只涉及到你的Keras设置问题。只需在<yourUserFolder>/.keras中设置你的keras.json文件,并将其设置为默认配置'channels_first'或'channels_last'即可。这些设置仅适用于你的机器。 - Arka Mallick
4个回答

6
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.* 更稳定。

1
感谢您的回答。如果我可以接受多个答案,我也会接受丹尼尔的答案,但我选择接受这个答案,因为它从动态形状方面提供了思路。这是TensorFlow flatten的明显优势。一开始我没有想到这个方向。+1 - Arka Mallick

5
  • 如果只是预处理和后处理,可以直接使用numpy来处理数据,不需要神经网络的参与。
  • 如果模型中确实需要进行该操作,请在模型中使用TF或Keras层。这将确保模型的连接性和适当的反向传播。

模型是用于创建可训练的神经网络的符号图。当你拥有从输入到输出相连的图时,会有正确的连接和反向传播。

如果你不想创建一个网络,请不要使用TF层。如果你的目标只是将数组展开,你不需要神经网络。

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


谢谢Daniel的回答,这让我更加清楚地了解了这两种方法的使用情况。我现在清楚地看到它们是用于培训过程的两个不同阶段。+1。感谢您对tf flatten方面符号图解释的说明。 - Arka Mallick

1
numpy中的flatten函数可以将数组完全展开,即你最终得到的是一维数据(仅有一个轴)。例如,
import numpy as np
a = np.arange(20).reshape((5,4))
print(a)

print(a.flatten().shape)

在之前的例子中,您最终得到了一个由20个元素组成的1D数组。在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 - Arka Mallick

1

区别

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

用法

如果这是训练过程中的一个操作,例如在传递到下一层之前调整大小,则应使用tensorflow op。

如果您想要在那个时间操作实际值,例如重新塑造以计算训练步骤结束时的准确度,则应使用numpy op。

因此,如果您有一个任务:

张量A -> 重新塑造 -> 矩阵乘法

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

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

  1. 计算张量A

  2. 您在numpy中重新塑造它。

  3. 通过“提供”重新塑造的数组来运行matrix_mul。

性能

我没有对任何东西进行基准测试,但我认为仅作为独立操作的reshape操作,如果忽略GPU,numpy会更快,但在reshape作为中间操作的过程中,TensorFlow应该会更快。


感谢您以结构化的方式解释了差异、用法和性能。点赞!就性能而言,我的经验证实了您在numpy方面的解释,但我认为tensorflow始终需要更长的时间。 - Arka Mallick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接