2025/07/13

TensorFlow→ML.NET

もうどの位の期間取り組んできたのか忘れた。相当時間掛かってます。Netronでモデルの情報確認してあれこれ試し、

model.export(save_path)

として保存してたのを

tf.saved_model.save(model, saved_model_path, signatures={"serving_default": serve_fn})

にしても結局何かがダメって言われる。この何かが理解不能でCopilotやGeminiで解決図ったが行き詰った。

public class TFShinbaModelInput
{
    [VectorType(1)]
    [ColumnName("serving_default_Baba")]
    public int[] Baba { get; set; }
    [VectorType(1)]
    [ColumnName("serving_default_Course")]
    public int[] Course { get; set; }
    [VectorType(1)]
    [ColumnName("serving_default_JouCD")]
    public int[] JouCD { get; set; }
...

新馬戦用でも1,018個の特徴量があったりで

var mlContext = new MLContext();

var inputType = typeof(TFShinbaModelInput);

var intColumns = inputType.GetProperties()
    .Where(p => p.PropertyType == typeof(int[]) &&
                p.GetCustomAttributesData().Any(a => a.AttributeType == typeof(ColumnNameAttribute)))
    .Select(p =>
    {
        var attr = p.GetCustomAttributesData()
            .FirstOrDefault(a => a.AttributeType == typeof(ColumnNameAttribute));
        return attr?.ConstructorArguments[0].Value?.ToString() ?? p.Name;
    })
    .ToArray();

var floatColumns = inputType.GetProperties()
    .Where(p => p.PropertyType == typeof(float[]) &&
                p.GetCustomAttributesData().Any(a => a.AttributeType == typeof(ColumnNameAttribute)))
    .Select(p =>
    {
        var attr = p.GetCustomAttributesData()
            .FirstOrDefault(a => a.AttributeType == typeof(ColumnNameAttribute));
        return attr?.ConstructorArguments[0].Value?.ToString() ?? p.Name;
    })
    .ToArray();

var allFeatureColumns = intColumns.Concat(floatColumns).ToArray();

var pipeline = mlContext.Model.LoadTensorFlowModel(Properties.Settings.Default.TF_Shinba)
    .ScoreTensorFlowModel(
        outputColumnNames: new[] { "StatefulPartitionedCall" },
        inputColumnNames: allFeatureColumns,
        addBatchDimensionInput: true);

こんな感じでしっかり準備したうえでロードしてるんですが結局ダメでした。

以前確か試した記憶があるんですが、TensorFlowモデルをonnx形式で保存してML.NETでonnx形式を利用する方法を試すべく新たな仮想環境を準備。ってのもtf2onnxはnumpy 2.0以降で削られたnp.castとかの部分がNGでnumpy 1.26.4にダウングレードして試す必要があるようなので、今その環境で新馬戦用モデルの学習してます。それが済んだらonnx形式で保存してML.NETでロードしてまた苦戦する予定😣

0 件のコメント:

コメントを投稿