如果您在此处未找到您的问题,请在填写新问题之前搜索 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 后,这些内容无法更改(但模型发布者可以选择发布具有不同数据类型的新模型)。
更新模型版本
可以更新模型版本的文档元数据。但是,该版本的资产(模型文件)是不可变的。如果你想更改模型资产,你可以发布较新版本的模型。最好使用变更日志扩展文档,描述版本之间更改的内容。