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 10 tensorflowtensorflow-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.frameworktf.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.optimizerstf.python.keras.layers 一起使用与tf.keras.optimizerstf.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.keras中度量和损失MSE之间的差异[重复]

使用tf.contrib.opt.ScipyOptimizerInterface和tf.keras.layers,丢失不变

Tensorflow2深度学习基础和tf.keras

tf.saved_model.save(model, path_to_dir) 和 tf.keras.model.save 的区别

使用 Tensorflow.keras 组织项目。应该是 tf.keras.Model 的一个子类吗?

tf.keras 模型 多个输入 tf.data.Dataset