我开始使用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或使用像
X_reshaped = X_train.reshape(*X_train.shape[:1], -2)
它在培训方面有何不同,哪种方法最佳?
答案 0 :(得分:4)
模型是用于创建可训练的神经网络的符号图。当您从输入到输出连接图形时,将有适当的连接并且反向传播将正常工作。
如果您不打算创建网络,请不要使用TF图层。如果您的目标只是为了展平阵列,则不需要神经网络。
现在,如果在模型中需要更改数据格式而不丢失连接和反向传播,那么请选择展平图层。
答案 1 :(得分:4)
np.flatten
和tf.layers.flatten
(或tf.contrib.layers.flatten
)之间的最大区别在于,numpy操作仅适用于静态nd数组,而tensorflow操作可以正常工作使用动态张量。在这种情况下,动态意味着只有在运行时(训练或测试)才能知道确切的形状。
所以我的建议非常简单:
np.flatten
。这样可以避免不必要的开销并返回numpy数组。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 ,则必须在两个阶段(两个会话调用)中运行该操作。
您计算张量A
你在numpy中重塑它。
通过&#34;喂养&#34;运行matrix_mul;重塑阵列。
<强>性能强>
我还没有对任何事情进行基准测试,但我只是说重塑操作是独立的,numpy会更快(忽略gpu),但在重塑是一个中间操作的过程中,张量流应该更快