【问题标题】:Converting a SavedModel to TFLite将 SavedModel 转换为 TFLite
【发布时间】:2023-04-02 18:17:01
【问题描述】:

我从here 下载了 FasterRCNN SavedModel。我想将其转换为 TFLite 模型。使用tflite_convert cli 似乎很简单。

tflite_convert --output_file model.tflite --saved_model_dir faster_rcnn_resnet101_coco_2018_01_28/saved_model

但是,我收到了一些关于未指定输入尺寸的问题

ValueError: None is only supported in the 1st dimension. Tensor 'image_tensor' has invalid shape '[None, None, None, 3]'

有人知道解决这个问题的方法吗?如果无法在 TFLite 中使用任意大小的图像,我猜肯定有一个方法可以覆盖 image_tensor 尺寸。

【问题讨论】:

  • 正如错误提示的那样,您的图像尺寸需要一个固定尺寸。您不能更改属于冻结图的张量的输入形状。您可以尝试在数据集上重新训练 FasterRCNN,从而指定模型的输入形状。
  • 所以解决这个问题的唯一方法是重新训练模型?没有办法加载 SavedModel 或冻结图并指定 image_tensor 的尺寸?
  • 我个人尝试过修改冻结图的输入张量,但一旦图被冻结,就无法进行修改。
  • @BadProgrammer 你能把更快的 rcnn 模型转换成 .tflite 吗?

标签: tensorflow tensorflow-lite


【解决方案1】:

您可以使用以下代码 sn-p 来执行此操作。

saved_model_dir = 'Path_to_saved_model_dir'

# Convert the model.
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()

# Save the TF Lite model.
with tf.io.gfile.GFile('model.tflite', 'wb') as f:
  f.write(tflite_model)

注意:此函数不允许您指定输入形状,因此您可以使用from_concrete_functions

model = tf.saved_model.load(saved_model_dir)
concrete_func = model.signatures[
  tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
concrete_func.inputs[0].set_shape([1, 256, 256, 3])
converter = TFLiteConverter.from_concrete_functions([concrete_func])

【讨论】:

  • 非常感谢@Dhairya...这是一个非常好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2020-10-14
  • 2017-11-11
  • 2020-03-09
  • 2019-04-10
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多