Как использовать обученную модель TensorFlow в ML.NET?

Я хочу использовать обученную модель из TensorFlow (v.2) в моем приложении C# .NET 5 код модели из питона

model = tf.keras.Sequential([
    normalizer,
    layers.Dense(128, activation="relu", input_dim=6),
    layers.Dense(128, activation="relu" ),
    layers.Dense(64, activation="relu" ),
    layers.Dense(64, activation="relu" ),
    layers.Dense(64,  activation="relu" ),
    layers.Dense(32,  activation="relu" ),
    layers.Dense(32,  activation="relu" ),
    layers.Dense(16,  activation="relu" ),
    layers.Dense(8,  activation="relu" ),
    layers.Dense(1, activation="linear")
])

После обучения и сохранения модели я выполнил преобразование в onnx с помощью команды

python -m tf2onnx.convert --saved-model savedModels\--output model_new.onnx

Но в c# я столкнулся с несколькими проблемами, я думаю, что преобразование onnx сделано неправильно, я ловлю всякие исключения, что размерности неправильные, что такой вход/выход не существует. Через netron я пытался посмотреть как мне правильно называть входы и выходы после преобразования, но я чет ниче не понял толком. Код C# здесь

class Program
    {
        static string ONNX_MODEL_PATH = "model_new_9.onnx";
        static void Main(string[] args)
        {
             MLContext mlContext = new MLContext();
            var onnxPredictionPipeline = GetPredictionPipeline(mlContext);
            var testInput = new OnnxInput
            {
                normaliztion_9_input = new float[6]
                //in1 = 5.0f,
                //in2 = 3.0f,
                //in3 = 200.0f,
                //in4 = 200.0f,
                //in5 = 10.0f
                //in6  = 5.f
            };
            var onnxPredictionEngine = mlContext.Model.CreatePredictionEngine<OnnxInput, OnnxOutput>(onnxPredictionPipeline);
            var prediction = onnxPredictionEngine.Predict(testInput);
            Console.WriteLine($"Predicted Fare: {prediction.PredictedFare.First()}");

        }
        static ITransformer GetPredictionPipeline(MLContext mlContext)
        {
            //var inputColumns = new string[]
            //{"in1", "in2", "in3", "in4", "in5", "in6"};

            var inputColumns = new string[]
            {"normaliztion_9_input"};

            var outputColumns = new string[] { "dense_109" };
            var onnxPredictionPipeline = mlContext.Transforms.ApplyOnnxModel(outputColumnNames: outputColumns, inputColumnNames: inputColumns, ONNX_MODEL_PATH);
            var emptyDv = mlContext.Data.LoadFromEnumerable(new OnnxInput[] { });
            return onnxPredictionPipeline.Fit(emptyDv);
        }

    }
    public class OnnxInput
    {
        /// <summary>
        ///  здесь должно быть 6 инпутов
        /// </summary>
        [ColumnName("normaliztion_9_input")]
        public float[] normaliztion_9_input { get; set; }
    }
    public class OnnxOutput
    {
        [ColumnName("dense_109")]
        public float[] PredictedFare { get; set; }
    }

Моя модель в python имеет вход из шести чисел и выход из одного числа. также прилагаю исходный файл модели и преобразованный файл https://drive.google.com/drive/folders/1mU8pZS9mhVU0nyMoHUXXPQKKNLO1Z136?usp=sharing


Ответы (0 шт):