使用tf.saved_model.load()加载模型时出现‘Read less bytes than requested’错误求助
解决Windows导出TensorFlow SavedModel在Mac/Docker加载时的"Read less bytes than requested"错误
问题背景
同事在Windows环境训练并导出了目标检测模型的SavedModel,目录包含variables文件夹(含variables.data-00000-of-00001、variables.index)和saved_model.pb。在Mac本地或Docker环境加载时,运行测试脚本:
import tensorflow as tf model = tf.saved_model.load("./saved_model") print("loaded model") print(model.summary())
触发如下错误:
Traceback (most recent call last): File "/Users/alexandrospouroullis/programming-projects/elevat3d/backend/workspace/training_demo/exported-models/my_model_1024/testFile.py", line 4, in model = tf.saved_model.load("./saved_model") File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/saved_model/load.py", line 782, in load result = load_partial(export_dir, None, tags, options)["root"] File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/saved_model/load.py", line 912, in load_partial loader = Loader(object_graph_proto, saved_model_proto, export_dir, File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/saved_model/load.py", line 189, in __init__ self._restore_checkpoint() File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/saved_model/load.py", line 507, in _restore_checkpoint load_status = saver.restore(variables_path, self._checkpoint_options) File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/training/tracking/util.py", line 1430, in restore object_graph_string = reader.get_tensor(base.OBJECT_GRAPH_PROTO_KEY) File "/Users/alexandrospouroullis/opt/miniconda3/envs/elevat3d-api/lib/python3.10/site-packages/tensorflow/python/training/py_checkpoint_reader.py", line 66, in get_tensor return CheckpointReader.CheckpointReader_GetTensor( IndexError: Read less bytes than requested
可能原因及解决方案
1. SavedModel文件传输损坏
Windows与Mac文件系统差异,或压缩/传输时未采用二进制模式,导致variables.data-00000-of-00001等二进制文件字节丢失。
- 解决:
- 让同事用二进制模式打包SavedModel(如zip打包时禁用文本转换),重新传输。
- 校验文件哈希值:在Windows端计算
variables.data-00000-of-00001的MD5/SHA256,Mac端接收后对比,确认文件完全一致。
2. TensorFlow版本不匹配
即使已解决依赖兼容,小版本差异(如Windows用2.10.0,Mac用2.10.1)可能导致SavedModel序列化格式细节不兼容。
- 解决:
- 确认Windows导出模型的TensorFlow版本,在Mac/Docker环境安装完全相同的版本。
- 若无法匹配版本,让同事重新导出模型时指定兼容格式,或升级/降级双方TensorFlow版本至同一稳定版。
3. 导出路径含特殊字符
Windows路径编码与Mac不同,若导出时路径包含中文、空格或特殊字符,可能导致SavedModel内部存储的路径信息异常。
- 解决:
- 让同事在Windows端使用无特殊字符的路径导出模型,如
D:/models/target_detection_model。 - 重新导出后再传输加载。
- 让同事在Windows端使用无特殊字符的路径导出模型,如
4. 模型导出不完整
Windows端导出过程中可能出现中断,导致variables文件夹或saved_model.pb未完全生成。
- 解决:
- 让同事重新执行导出命令,确保日志无报错,导出完成后再打包传输。
- 对比导出后模型文件的大小,确认与正常导出的同类型模型大小匹配。
验证步骤
- 优先校验文件完整性,对比哈希值排除损坏问题;
- 匹配TensorFlow版本,用相同版本尝试加载;
- 若以上无效,让同事重新导出模型,确保导出过程正常。
内容的提问来源于stack exchange,提问作者AlePouroullis
相关产品推荐
相关产品推荐

