基于TensorFlow Hub的MobileNetV2模型加载周期性失效问题求助
长期解决方案
方案1:将TF Hub模型下载到本地固定目录构建模型
把依赖的MobileNetV2模型下载到本地非临时目录,后续构建和加载自定义模型都基于这个本地路径,彻底脱离临时缓存依赖:
- 首先设置固定缓存目录,或者手动下载模型到本地:
import os import tensorflow as tf import tensorflow_hub as hub # 指定本地固定目录存储TF Hub模型 local_model_dir = "./local_tfhub_models/mobilenet_v2_feature_vector" os.makedirs(os.path.dirname(local_model_dir), exist_ok=True) # 第一次运行会自动下载模型到本地,之后直接复用 if not os.path.exists(local_model_dir): hub_layer = hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4") tf.saved_model.save(hub_layer, local_model_dir) # 基于本地路径构建自定义模型 base_model = hub.KerasLayer(local_model_dir, input_shape=(224, 224, 3), trainable=False) custom_model = tf.keras.Sequential([ base_model, tf.keras.layers.Dense(5, activation="softmax") # 根据你的分类任务调整输出维度 ]) # 训练后保存模型 custom_model.save("./model/model_flower.h5")
- 加载模型时,直接读取本地路径的模型,无需担心临时缓存被清理:
my_reloaded_model = tf.keras.models.load_model( "./model/model_flower.h5", custom_objects={'KerasLayer': hub.KerasLayer} )
方案2:使用SavedModel格式保存完整模型
TF的SavedModel格式会将自定义模型和依赖的TF Hub子模型打包成一个自包含的目录,完全不依赖外部缓存:
- 构建模型后,用SavedModel格式保存(不需要加
.h5后缀):
import tensorflow as tf import tensorflow_hub as hub # 构建自定义模型 base_model = hub.KerasLayer("https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4", input_shape=(224, 224, 3), trainable=False) custom_model = tf.keras.Sequential([ base_model, tf.keras.layers.Dense(5, activation="softmax") ]) # 保存为SavedModel格式(目录形式) custom_model.save("./model/model_flower_savedmodel")
- 加载模型时直接读取该目录:
my_reloaded_model = tf.keras.models.load_model( "./model/model_flower_savedmodel", custom_objects={'KerasLayer': hub.KerasLayer} )
方案3:修改TF Hub默认缓存目录为固定路径
通过设置环境变量,让TF Hub将模型缓存到非临时目录,避免系统自动清理:
在代码开头添加以下配置,指定一个不会被系统清理的目录作为缓存:
import os # 替换为你自己的固定缓存目录 os.environ["TFHUB_CACHE_DIR"] = "D:/tfhub_permanent_cache"
之后所有TF Hub模型都会缓存到这个固定目录,即使临时目录被清理也不会影响模型加载。
内容的提问来源于stack exchange,提问作者Quat Tran Dang
相关产品推荐
相关产品推荐

