我开始使用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)
这对训练有什么不同,哪种做法是最佳实践?
回答:
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.*
更稳定。