tensorflow - .pb 文件到 tflite 转换时无法解析文件错误
问题描述
嗨,我正在使用 tf1.15 中的 pb 文件为自定义 albert 模型制作 tflite,但引发了错误
raise IOError("Cannot parse file %s: %s." % (path_to_pb, str(e)))
OSError: Cannot parse file b'/home/choss/test2/freeze2/saved_model.pb': Error parsing message.
下面的代码是我如何制作 .pb 文件
meta_path = 'model.ckpt-400.meta' # Your .meta file
output_node_names = ['loss/Softmax']
with tf.Session() as sess:
# Restore the graph
saver = tf.train.import_meta_graph(meta_path)
# Load weights
ckpt ='/home/choss/test2/freeze2/model.ckpt-400'
print(ckpt)
saver.restore(sess, ckpt)
output_node_names = [n.name for n in tf.get_default_graph().as_graph_def().node]
# Freeze the graph
frozen_graph_def = tf.graph_util.convert_variables_to_constants(
sess,
sess.graph_def,
output_node_names)
# Save the frozen graph
with open('saved_model.pb', 'wb') as f:
f.write(frozen_graph_def.SerializeToString())
我试图用下面的代码制作 tflite 文件
saved_model_dir = "/home/choss/test2/freeze2"
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
我使用 f.graph_util.convert_variables_to_constants 因为 freeze_graph 因为
freeze_graph.freeze_graph('./graph.pbtxt', saver, False, 'model.ckpt-400', 'loss/ArgMax', "", "", 'frozen.pb', True, "")
给了我一条错误信息
File "/home/pgb/anaconda3/envs/myenv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 2154, in __getitem__
return self._inputs[i]
IndexError: list index out of range
是因为我没有使用 freeze_graph 吗?如果是这样,除了 freeze_graph 还有其他方法吗?
解决方案
我建议不要自己冻结图形,而是导出为 TF 保存的模型,并将保存的模型转换器与最新的 TF 版本一起使用。您可以解耦 TensorFlow 版本以进行训练和转换。例如,可以在 TF 1.15 中进行训练,并且可以从中导出保存的模型。然后,可以将保存的模型带到 TensorFlow 2.4.1 或更高版本的 TFLite 转换器 API。
推荐阅读
- matlab - 4D分散数据的Matlab插值
- apache - 将 IIS htaccess 转换为 Apache htaccess 拆分 URL
- r - 计算列值之间的差异
- powershell - 如何按特定顺序启动多个服务,如果没有可用的服务,它将跳到下一个可用的服务?
- swift - 将 NSMutableData 的一部分复制到新的 NSMutableData 对象
- c++ - Cmake 在 Windows 中运行良好,但在程序在 Linux ( Ubuntu ) 中运行时会出现链接器错误
- c# - C# 以编程方式生成枚举
- api - WSO2 API Manager - 用于连接 WSO2 API 管理器以执行 TOKEN API 操作的 Java 代码示例,例如生成生产密钥、令牌、刷新令牌等
- laravel - 如何使用 socket.io 加速 laravel 应用程序
- c# - Docusign 获取更新的文档