我开始使用 keras 和 tensorflow 进行深度学习。在最初阶段,我有一个疑问。当我使用 tf.contrib.layers.flatten
(Api 1.8) 用于拼合图像(也可以是多 channel 的)。
这与使用 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)
它在训练中有什么不同,哪种是最佳实践?
最佳答案
np.flatten
和tf.layers.flatten
(或tf.contrib.layers.flatten
)最大的区别是numpy操作仅适用于静态 nd 数组,而 tensorflow 操作可用于动态张量。在这种情况下,动态意味着只有在运行时(训练或测试)才能知道确切的形状。
所以我的建议很简单:
- 如果输入数据是静态 numpy 数组,例如在预处理中,使用
np.flatten
。这避免了不必要的开销并返回 numpy 数组。 - 如果数据已经是张量,请使用 tensorflow 提供的任何
flatten
操作。在它们之间,tf.layers.flatten
是更好的选择,因为tf.layers
API 比tf.contrib.*
更稳定。
关于python - Tensorflow flatten vs numpy flatten 函数对机器学习训练的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50259290/