【问题标题】:TFLite: Is it possible to convert a H5 model but with a different input shape using Keras' load_model?TFLite:是否可以使用 Keras 的 load_model 转换具有不同输入形状的 H5 模型?
【发布时间】:2019-11-30 09:26:04
【问题描述】:

我目前使用此脚本将我的 H5 模型转换为 TFLite:

 # CONVERTING TO TFLITE FORMAT
    g.save(os.path.join(save_dir, 'full_generator_{}_{}.h5'.format(epoch_number, current_loss)), include_optimizer=False)

    model = tf.keras.models.load_model(
        os.path.join(save_dir, 'full_generator_{}_{}.h5'.format(epoch_number, current_loss)), custom_objects={'ReflectionPadding2D': ReflectionPadding2D})
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()

    open(os.path.join(save_dir, 'full_generator_{}_{}.tflite'.format(epoch_number, current_loss)),
         "wb").write(tflite_model)
 # /CONVERTING TO TFLITE FORMAT

我的问题是 H5 模型的输入形状尺寸为 256x256x3。我想要的是转换后的 TFLite 模型的输入形状尺寸为 800x800x3。

我知道冻结图形 TF 函数是可能的。

但是load_model可以吗?

【问题讨论】:

  • 您无法更改冻结图的输入形状,因此也无法更改 TFLite 文件。

标签: tensorflow keras tensorflow2.0 tf.keras tensorflow-lite


【解决方案1】:

您可以使用新的输入签名将模型包装在 tf.function 中,然后转换 from_concrete_functions

model = tf.keras.models.load_model(
    os.path.join(save_dir, 
                 'full_generator_{}_{}.h5'.format(epoch_number, current_loss)), 
    custom_objects={'ReflectionPadding2D': ReflectionPadding2D})

wrapped_model = tf.function(lambda input_data: model(input_data))
input_spec = tf.TensorSpec((800, 800, 3), model.inputs[0].dtype)
concrete_func = wrapped_model.get_concrete_function(input_spec)
converter = tf.lite.TFLiteConverter.from_concrete_functions([concrete_func])

如果您的模型不支持更改大小,您还可以创建一个 tf.function 调整输入大小以匹配模型所需的形状。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2020-09-10
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2021-11-30
    • 2018-05-13
    • 2019-06-10
    • 1970-01-01
    相关资源
    最近更新 更多