Tensorflow 我的Keras yolov3-tiny.h5模型有一个输入张量,其维数为?,,,,3,而我预期的是?,,416416,3

Tensorflow 我的Keras yolov3-tiny.h5模型有一个输入张量,其维数为?,,,,3,而我预期的是?,,416416,3,tensorflow,keras,Tensorflow,Keras,使用netron检查Keras型号yolov3-tiny.h5时 我看到输入节点称为input_1,其类型为float32[?,?,?,3]。我希望浮动32[?,416416,3] 我怎样才能强制它浮动32[?,416416,3]? 这是下游处理所必需的。必须将Keras模型转换为Tensorflow中的冻结_model.pb,然后进一步处理以进行部署。 部署工具无法处理w、h大小未知的输入 下面是我如何生成Keras模型的。我下载了yolov3-tiny.cfg()和yolov3-tiny.w

使用netron检查Keras型号yolov3-tiny.h5时

我看到输入节点称为input_1,其类型为float32[?,?,?,3]。我希望浮动32[?,416416,3]

我怎样才能强制它浮动32[?,416416,3]? 这是下游处理所必需的。必须将Keras模型转换为Tensorflow中的冻结_model.pb,然后进一步处理以进行部署。 部署工具无法处理w、h大小未知的输入

下面是我如何生成Keras模型的。我下载了yolov3-tiny.cfg()和yolov3-tiny.weigths()

然后使用以下命令将模型转换为keras模型:

python convert.py-p yolov3-tiny.cfg yolov3-tiny.weights model_data/yolov3-tiny.h5

(此代码通过克隆获得)

使用保存的Keras模型进行预测效果良好: python yolo_video.py--image--model model_data/yolov3-tiny.h5

但是,当使用netron检查Keras型号yolov3-tiny.h5时

我看到输入节点称为input_1,其类型为float32[?,?,?,3]

我希望浮动32[?,416416,3]


如何将其强制为float32[?,416416,3]?

您可以在将keras模型文件转换为tflite时执行此操作,方法是将输入形状作为字典传递,输入节点名称作为键,形状作为值。 查看TFLiteConverter类


那很有趣。我唯一能想到的是模型不知道输入形状应该是什么。您是否在keras模型中定义了输入形状?你能加载模型,然后打印摘要,看看结果如何吗
    def _main_(args):
        kmodel = args.kmodel
        lmodel = args.lmodel
        converter = tf.lite.TFLiteConverter.from_keras_model_file(kmodel, input_shapes={"input_1":[1,416,416,3]})
        converter.optimizations = [tf.lite.Optimize.DEFAULT]
        tflite_model = converter.convert()
        open("lmodel", "wb").write(tflite_model)


    if __name__ == '__main__':
        argparser = argparse.ArgumentParser(description='Quantize a trained yolo model')
        argparser.add_argument('-k', '--kmodel', help='path to model weights file input')
        argparser.add_argument('-l', '--lmodel', help='path to tensor flow lite output')
        args = argparser.parse_args()
        _main_(args)