tf.keras和tf.python.keras有什么区别?

时间:2019-10-08 02:53:07

标签: python tensorflow keras tensorflow2.0

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

查看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 个答案:

答案 0 :(得分:4)

从官方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.optimizerstf.python。但是如上所述,除非您正在“开发”(即编写自定义功能或类),否则这不会成为问题。无需触摸tf.keras即可使用“开箱即用”功能。

请注意,这不仅是兼容性问题,而且“只要没有任何问题”,两者就不能互换。例如,tf.python.keras使用optimizer_v2,这与tf.python.keras Optimizer完全不同。

最后,请注意,以上两个链接都以tf.keras结尾-不确定,但是看来OptimizerV2在TF Github中实际上并不存在(例如,没有引用tensorflow_core/python/keras/api/_v2) ,但在本地安装时,它会与from tensorflow import keras print(keras.__file__) from tensorflow.python import keras print(keras.__file__) 文件夹中的TF 合并:

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.layerstf.keras.optimizers一起使用的tf.keras.layersdone一起使用的ver运行速度慢了 11.5倍中型模型(code)。我继续在用户代码中看到前者-将其视为警告提示。