tf.keras 和 tf.python.keras 有啥区别?
Posted
技术标签:
【中文标题】tf.keras 和 tf.python.keras 有啥区别?【英文标题】:What is the difference between tf.keras and tf.python.keras?tf.keras 和 tf.python.keras 有什么区别? 【发布时间】:2020-02-05 08:15:11 【问题描述】:我遇到了一个与另一个运行相同代码的严重不兼容问题;例如:
Getting value of tensor Compiling model Saving optimizer查看Github source,模块及其导入看起来非常相似,tf.keras
甚至从tf.python.keras
导入。在教程中,我看到两者都被不时使用。例如,下面的代码将失败并显示tf.python.keras
。
有什么关系?有什么区别,我什么时候应该使用其中一种?
from tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Nadam
import numpy as np
ipt = Input(shape=(4,))
out = Dense(1, activation='sigmoid')(ipt)
model = Model(ipt, out)
model.compile(optimizer=Nadam(lr=1e-4), loss='binary_crossentropy')
X = np.random.randn(32,4)
Y = np.random.randint(0,2,(32,1))
model.train_on_batch(X,Y)
附加信息:
CUDA 10.0.130、cuDNN 7.4.2、Python 3.7.4、Windows 10tensorflow
、tensorflow-gpu
v2.0.0 和 Keras 2.3.0 通过 pip,其他所有通过 Anaconda 3
【问题讨论】:
【参考方案1】:来自官方TensorFlow dev,缩写(强调我的):
API 导入位于包的根目录中。任何其他导入都只是 Python 允许您访问私人而不考虑良好的编码实践。
导入的唯一方式应该是
import tensorflow as tf tf.keras
我们还为
from tensorflow.keras import
提供支持, 尽管这很脆弱,并且在我们不断重构时可能会损坏。 从tensorflow.python
或任何其他模块导入(包括import tensorflow_core
)不支持,并且可能会在未通知的情况下中断。
我:确认一下,tf.python.keras
是私有,用于开发,而不是公共使用?
是的,确实如此。
tf.python
下的任何内容都是私有的
然而,这还不是全部。 tf.python
仍然是访问某些函数/类的唯一方法 - 例如,tf.python.framework
和 tf.python.ops
,两者都在 tf.keras.optimizers
中使用。但如上所述,除非您正在“开发” - 即编写自定义功能或类,否则这不会成为问题。无需接触tf.python
,“开箱即用”的用法应该没问题。
请注意,这不仅仅是兼容性问题,而且两者不可互换“只要没有损坏”;例如,tf.keras
使用 optimizer_v2,这与 tf.python.keras
Optimizer 有很大不同。
最后,请注意,以上两个链接都以 tf.python.keras
结尾——不确定,但似乎 tf.keras
实际上并不存在于 TF Github 中(例如,没有任何引用 OptimizerV2
),但它 是否在本地安装时与tensorflow_core/python/keras/api/_v2
文件夹中的TF合并:
from tensorflow import keras
print(keras.__file__)
from tensorflow.python import keras
print(keras.__file__)
D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\api\_v2\keras\__init__.py
D:\Anaconda\lib\site-packages\tensorflow_core\python\keras\__init__.py
虽然两者都共享python/
文件夹,但它们不是都是tf.python
- 可以通过各自的__init__.py
进行验证。
更新:tf.python.keras.optimizers
与tf.python.keras.layers
一起使用与tf.keras.optimizers
与tf.keras.layers
一起使用对于中型模型运行慢11.5 倍 (code )。我继续在用户代码中看到前者 - 将此视为警告。
【讨论】:
很多时候,我的环境无法正确获取tf.keras
。只能找到tf.python.keras
。
@LouisYang 取决于 - 如前所述,某些导入仅在 tf.python.keras
中找到。例如,如果你不能做到from tensorflow.keras.layers import Dense
(“out of box”),那就是安装问题。
这只发生在 tensorflow 2.0 上吗?我正在使用 Bazel 测试。即使我可以在常规 python 脚本中从tf.keras
导入,Bazel 测试也看不到它。另外,我的 IDE 也看不到 tf.keras。只有 tf.python.keras 存在...
@LouisYang 从未使用过 Bazel - 我建议检查其源代码以了解它如何处理导入;一些存储库通过environment flag 切换到tf.keras
。您的 IDE 没有找到 tf.keras
但找到 tf.python.keras
很奇怪 - 不妨提出一个关于它的问题。以上是关于tf.keras 和 tf.python.keras 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
使用tf.contrib.opt.ScipyOptimizerInterface和tf.keras.layers,丢失不变
tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 的区别