python - TensorFlow flatten vs numpy flatten 函数对机器学习训练的影响
问题描述
我开始使用 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 数组。 - 如果数据已经是张量,请使用
flatten
tensorflow 提供的任何操作。在这两者之间,tf.layers.flatten
是更好的选择,因为tf.layers
API 比tf.contrib.*
.
推荐阅读
- python - 事务未进行,不能在 API 请求中使用。火灾存储错误
- python-3.x - 从 python 脚本返回结果到 Jupiter notebook 中的变量
- ansible - 使用 ansible 在组中有限数量的主机上运行任务
- php - PHP preg_replace 在同一个字符串中多次替换模式
- amazon-web-services - 使用 AWS CDK 配置具有 S3 源和自定义源 (ELB) 的 CloudFront 分配
- python - 在 Python Visual Studio Code Debugger 中调用类中的私有函数以观察列表
- javascript - 使用图层位置捕获或导出 konvajs 阶段
- image - Xamarin 表单从图像控件而不是文件从图像转换为 Base64
- javascript - (Javascript)当类是动态的时,如何计算特定类的元素总和?
- clojure - 没有命名空间的取消引用