可以导出具有可变输入大小的张量流模型吗?

时间:2019-12-13 17:34:14

标签: python tensorflow model export tensorflow.js

我正在使用saved_model.Builder

导出模型
builder = tf.compat.v1.saved_model.Builder(output_dir)
inputs = graph.get_tensor_by_name('input_x:0')
outputs = graph.get_tensor_by_name('output_y:0')

model_input = tf.saved_model.utils.build_tensor_info(inputs)
model_output = tf.saved_model.utils.build_tensor_info(outputs)

signature_definition = tf.saved_model.signature_def_utils.build_signature_def(
    inputs={'inputs': model_input},
    outputs={'outputs': model_output},
    method_name= tf.saved_model.signature_constants.PREDICT_METHOD_NAME)

builder.add_meta_graph_and_variables(
   sess, [tf.saved_model.SERVING],
   signature_def_map={tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_definition},
   clear_devices=True)

builder.save()

我可以在tensorflow.js中导入并使用此模型。但是,它仅适用于具有input_x张量的特定输入大小的图像。 有没有一种方法可以以input_x张量可以具有可变大小的方式导出模型?

  • 如果未导出模型并在python中使用该模型,即在图像上加载权重并进行推理,则输入图像的大小可能与训练期间使用的大小不同,并且预测仍将正常工作。
  • 我猜想在导出模型后进行推断时,还会执行其他验证。为什么会这样呢?可以将它们删除吗?
  • 最简单的解决方案是重新采样/调整新输入图像的大小,但是...

2 个答案:

答案 0 :(得分:0)

  

如果未导出模型并在python中使用该模型,即在图像上加载权重并进行推理,则输入图像的大小可能与训练期间使用的大小不同,并且预测仍将正常工作

如果该模型至少没有用于Python培训,为什么要用Python编写呢?优点可能是转换器提供的开箱即用的量化功能。但这也可以通过将js模型转换为js量化模型来实现。

要回答一个主要问题:模型始终期望有某种输入形状。 inputShape不能为变量。无论是用Python还是Js编写的模型,都是如此。由于模型本身无法在不修复inputShape的情况下编写,因此转换器也不能在没有模型的情况下工作。

  

最简单的解决方案是重新采样/调整新输入图像的大小,但是

这是要走的路。在给定输入形状后训练模型,唯一适用的方法是调整图像大小或裁剪图像。

答案 1 :(得分:0)

这个npm包可以重新采样/调整大小到给定的尺寸,并且可以在运行推理之前嵌入js逻辑中。 itk-image-pad-resample