常见问题

如果您在此处未找到您的问题,请在填写新问题之前搜索 github 问题

TypeError: 'AutoTrackable' 对象不可调用

# BAD: Raises error
embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed(['my text', 'batch'])

在使用 hub.load() API 在 TF2 中加载 TF1 Hub 格式模型时,经常会出现此错误。添加正确的签名应解决此问题。有关迁移到 TF2 以及在 TF2 中使用 TF1 Hub 格式模型的更多详细信息,请参阅TF-Hub TF2 迁移指南


embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed.signatures['default'](['my text', 'batch'])

无法下载模块

在从 URL 使用模块的过程中,由于网络堆栈,可能会出现许多错误。通常,这是运行代码的机器特有的问题,而不是库的问题。以下是常见问题列表

  • “违反协议发生 EOF” - 如果已安装的 Python 版本不支持托管模块的服务器的 TLS 要求,则可能会生成此问题。值得注意的是,已知 python 2.7.5 无法解析来自 tfhub.dev 域的模块。修复:请更新到较新的 python 版本。

  • “无法验证 tfhub.dev 的证书” - 如果网络上的某些内容试图充当 dev gTLD,则可能会生成此问题。在 .dev 用作 gTLD 之前,开发人员和框架有时会使用 .dev 名称来帮助测试代码。修复:识别并重新配置在 “.dev” 域中拦截名称解析的软件。

  • 无法写入缓存目录 /tmp/tfhub_modules(或类似目录):请参阅缓存了解其内容以及如何更改其位置。

如果上述错误和修复不起作用,则可以通过模拟将 ?tf-hub-format=compressed 附加到 URL 的协议来尝试手动下载模块,以下载必须手动解压缩到本地文件的 tar 压缩文件。然后可以使用本地文件的路径代替 URL。这是一个快速示例

# Create a folder for the TF hub module.
$ mkdir /tmp/moduleA
# Download the module, and uncompress it to the destination folder. You might want to do this manually.
$ curl -L "https://tfhub.dev/google/universal-sentence-encoder/2?tf-hub-format=compressed" | tar -zxvC /tmp/moduleA
# Test to make sure it works.
$ python
> import tensorflow_hub as hub
> hub.Module("/tmp/moduleA")

对预初始化模块运行推理

如果您正在编写一个在输入数据上多次应用模块的 Python 程序,则可以应用以下配方。(注意:对于在生产服务中提供服务,请考虑TensorFlow Serving或其他可扩展的、无 Python 的解决方案。)

假设你的用例模型是初始化和后续请求(例如 Django、Flask、自定义 HTTP 服务器等),你可以按如下方式设置服务

TF2 SavedModels

  • 在初始化部分
    • 加载 TF2.0 模型。
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • 在请求部分
    • 使用嵌入函数运行推理。
embedding_fn(["Hello world"])

此 tf.function 调用经过优化以提高性能,请参阅tf.function 指南

TF1 Hub 模块

  • 在初始化部分
    • 使用占位符构建图形 - 图形的入口点。
    • 初始化会话。
import tensorflow as tf
import tensorflow_hub as hub

# Create graph and finalize (finalizing optional but recommended).
g = tf.Graph()
with g.as_default():
  # We will be feeding 1D tensors of text into the graph.
  text_input = tf.placeholder(dtype=tf.string, shape=[None])
  embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
  embedded_text = embed(text_input)
  init_op = tf.group([tf.global_variables_initializer(), tf.tables_initializer()])
g.finalize()

# Create session and initialize.
session = tf.Session(graph=g)
session.run(init_op)
  • 在请求部分
    • 使用会话通过占位符将数据馈送到图形中。
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

无法更改模型的数据类型(例如,float32 到 bfloat16)

TensorFlow 的 SavedModels(在 TF Hub 或其他地方共享)包含对固定数据类型(通常是神经网络的权重和中间激活的 float32)进行操作。在加载 SavedModel 后,这些内容无法更改(但模型发布者可以选择发布具有不同数据类型的新模型)。

更新模型版本

可以更新模型版本的文档元数据。但是,该版本的资产(模型文件)是不可变的。如果你想更改模型资产,你可以发布较新版本的模型。最好使用变更日志扩展文档,描述版本之间更改的内容。