【问题标题】:What is the difference between tf.keras and tf.python.keras?tf.keras 和 tf.python.keras 有什么区别?
【发布时间】:2020-02-05 08:15:11
【问题描述】:

我遇到了一个与另一个运行相同代码的严重不兼容问题;例如:

查看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

【问题讨论】:

    标签: python tensorflow keras tensorflow2.0


    【解决方案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 很奇怪 - 不妨提出一个关于它的问题。
    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    相关资源
    最近更新 更多