使用 Tensorflow hub 时 SavedModel 文件不存在

SavedModel file does not exist when using Tensorflow hub

尝试使用 tensorflow_hub 中的 hub.load 函数时,出现 OSError: SavedModel file does not exist at: 错误。

奇怪的是几天前它还有效,所以我不太明白为什么我现在会收到这个错误。

重现代码:

import tensorflow as tf
import tensorflow_hub as hub

URL = 'https://tfhub.dev/google/universal-sentence-encoder/4'
embed = hub.load(URL)

收到特定错误:

OSError                                   Traceback (most recent call last)
<ipython-input-11-dfb80f0299b2> in <module>
      1 URL = 'https://tfhub.dev/google/universal-sentence-encoder/4'
----> 2 embed = hub.load(URL)

~/opt/anaconda3/lib/python3.7/site-packages/tensorflow_hub/module_v2.py in load(handle, tags)
    100   if tags is None and is_hub_module_v1:
    101       tags = []
--> 102   obj = tf_v1.saved_model.load_v2(module_path, tags=tags)
    103   obj._is_hub_module_v1 = is_hub_module_v1  # pylint: disable=protected-access
    104   return obj

~/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py in load(export_dir, tags)
    576     ValueError: If `tags` don't match a MetaGraph in the SavedModel.
    577   """
--> 578   return load_internal(export_dir, tags)
    579 
    580 

~/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/load.py in load_internal(export_dir, tags, loader_cls)
    586     tags = nest.flatten(tags)
    587   saved_model_proto, debug_info = (
--> 588       loader_impl.parse_saved_model_with_debug_info(export_dir))
    589 
    590   if (len(saved_model_proto.meta_graphs) == 1 and

~/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/loader_impl.py in parse_saved_model_with_debug_info(export_dir)
     54     parsed. Missing graph debug info file is fine.
     55   """
---> 56   saved_model = _parse_saved_model(export_dir)
     57 
     58   debug_info_path = os.path.join(

~/opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/loader_impl.py in parse_saved_model(export_dir)
    111                   (export_dir,
    112                    constants.SAVED_MODEL_FILENAME_PBTXT,
--> 113                    constants.SAVED_MODEL_FILENAME_PB))
    114 
    115 

OSError: SavedModel file does not exist at: /var/folders/77/rvfl368x44s51r8dc3b6l2rh0000gn/T/tfhub_modules/063d866c06683311b44b4992fd46003be952409c/{saved_model.pbtxt|saved_model.pb}

因此,只需删除该文件夹并 运行 hub.load() 函数再次解决问题

我已经尝试过上述解决方案,但它对我不起作用...

这是有效的方法:

  1. 使用资产、变量和 .pb 检查点文件从 tfhub.dev 下载模型。
  2. 确保导入 tensorflow_text 模块!

import tensorflow_text

  1. hub.load()语句中指定下载的文件夹路径,如:

model = hub.load("/Users/bilguun/Desktop/universal-sentence-encoder-multilingual-large_3/")

我使用的是 i3d = hub.load(https://tfhub.dev/deepmind/i3d-kinetics-400/1).signatures['default'] 如图所示 here

这种加载模型的方法在那天有效,但几天后我得到了同样的错误:OSError: SavedModel file does not exist at: C:\Users\catal\AppData\Local\Temp\tfhub_modules2225fb776e28d6d64ac605ab6be03f18dd2027{saved_model.pbtxt|saved_model.pb}

经过一些研究,我了解到 saved_model 文件位置(在错误中指定)是临时的,因此即使该文件夹仍然存在,其中也不再有 saved_model.pb。所以我下载了这里链接的模型:https://tfhub.dev/deepmind/i3d-kinetics-400/1 并设置了 i3d = hub.load("C:\absolute_path_to_saved_model_folder").signatures['default'] 并且它起作用了。

所以使用 Bilguun 的回答对我来说真的很有帮助。

出现这种错误是因为下载的模型保存在应用程序创建的临时文件夹中。

由于是临时文件夹,保存在其中的模型可能会被删除,甚至可以删除文件夹。

当调用hub.load()命令时,程序会检查临时文件夹,如果找不到该文件夹​​,程序将从互联网上下载数据。

但是如果找到文件夹但数据(或模型)不存在,则不会从 Internet 下载,而是会引发错误。

完全删除临时文件夹即可解决

在 Mac 中,可以通过终端上的命令“打开 $TMPDIR”访问临时文件夹(参考:https://osxdaily.com/2018/08/17/where-temp-folder-mac-access/)。 文件夹的名字可以从报错中得到,可以轻松删除。