tf2onnxでONNXに書き出すと、大量のTransposeが生成されます。これは、TensorflowがNHWCなのに対して、ONNXがNCHWなため、並べ替えが発生するためです。この問題は、TransposeOptimizerを使用することで回避することができます。

通常のエクスポートコード
    graph1 = tf.Graph()
    with graph1.as_default():
        tf.import_graph_def(frozen_graph_def)
        onnx_graph = tf2onnx.tfonnx.process_tf_graph(graph1, input_names=input_names, output_names=output_names, opset=10)

        model_proto = onnx_graph.make_model("onnx")
        with open("output.onnx", "wb") as f:
            f.write(model_proto.SerializeToString())

before

TransposeOptimizerを使用
    graph1 = tf.Graph()
    with graph1.as_default():
        tf.import_graph_def(frozen_graph_def)
        onnx_graph = tf2onnx.tfonnx.process_tf_graph(graph1, input_names=input_names, output_names=output_names, opset=10)

        from tf2onnx.optimizer.transpose_optimizer import TransposeOptimizer
        optimizer = TransposeOptimizer()
        opt_model_proto = optimizer.optimize(onnx_graph)

        model_proto = onnx_graph.make_model("onnx")
        with open("output.onnx", "wb") as f:
            f.write(model_proto.SerializeToString())

after

オプティマイズすることで、推論速度は1.5倍程度高速化されます。

tf-onnx introducing many transpose operations
add transpose optimizer, and integrate it after tf graph conversion #108