Как использовать обученную модель 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