此页面由 Cloud Translation API 翻译。
Switch to English

使用TensorFlow Hub从TF1迁移到TF2

此页面说明了如何在将TensorFlow代码从TensorFlow 1迁移到TensorFlow 2时继续使用TensorFlow Hub。它补充了TensorFlow的常规迁移指南

对于TF2,TF Hub已从传统的hub.Module API hub.Module用于构建tf.compat.v1.Graph就像tf.contrib.v1.layers一样。相反,现在有一个hub.KerasLayer与其他hub.KerasLayer层一起用于构建tf.keras.Model (通常在TF2的新的急切执行环境中 ),以及用于底层TensorFlow代码的基础hub.load()方法。

tensorflow_hub库中仍然可以使用hub.Module API,以在TF1和TF2的TF1兼容模式下使用。它只能加载TF1 Hub格式的模型。

hub.load()hub.KerasLayer的新API适用于TensorFlow 1.15(在急切和图形模式下)和TensorFlow 2中。该新API可以加载新的TF2 SavedModel资产,并具有模型中列出的限制兼容性指南 ,是TF1 Hub格式的旧模型。

通常,建议尽可能使用新的API。

新API摘要

hub.load()是新的低级函数,用于从TensorFlow Hub(或兼容的服务)加载SavedModel。它包装了TF2的tf.saved_model.load() ; TensorFlow的SavedModel指南描述了您可以对结果执行的操作。

 m = hub.load(handle)
outputs = m(inputs)
 

hub.KerasLayer类调用hub.load()并调整结果以使其与其他Keras层一起在hub.load()中使用。 (对于以其他方式使用的已加载SavedModel,它甚至可能是一个方便的包装器。)

 model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])
 

许多教程都展示了这些API的作用。特别看到

在Estimator培训中使用新的API

如果您在Estimator中使用TF2 SavedModel进行参数服务器训练(或者在TF1会话中将变量放置在远程设备上),则需要在tf.Session的ConfigProto中设置experimental.share_cluster_devices_in_session ,否则您将收到错误消息例如“分配的设备'/ job:ps /副本:0 /任务:0 /设备:CPU:0'与任何设备都不匹配。”

可以像这样设置必要的选项

 session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)
 

从TF2.2开始,此选项不再是实验性的,可以删除.experimental部分。

加载TF1 Hub格式的旧模型

可能发生的情况是,新的TF2 SavedModel尚不适用于您的用例,您需要以TF1 Hub格式加载旧模型。从tensorflow_hub 0.7版开始,您可以将TF1集线器格式的旧模型与hub.KerasLayer一起使用,如下所示:

 m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)
 

此外, KerasLayer了指定tagssignatureoutput_keysignature_outputs_as_dict用于TF1 Hub格式的旧模型和旧SavedModels的更多特定用法。

有关TF1集线器格式兼容性的更多信息,请参见型号兼容性指南

使用较低级别的API

可以通过tf.saved_model.load加载旧版TF1 Hub格式模型。代替

 # DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)
 

建议使用:

 # TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)
 

在这些示例中, m.signatures是由签名名称键控的TensorFlow 具体功能的决定 。调用此类函数会计算其所有输出,即使未使用也是如此。 (这与TF1的图形模式的惰性评估不同。)