You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ML.NET Fit()训练过程中,如何获取并展示训练日志?

实现WinForms中实时显示Microsoft.ML训练日志的方法

1. 自定义UI绑定的日志记录器

实现Microsoft.ML.Runtime.ILogger接口,将训练产生的日志消息转发到WinForms的UI控件(如TextBox),同时处理跨线程更新UI的问题:

using Microsoft.ML.Runtime;
using System;
using System.Windows.Forms;

public class WinFormsLogger : ILogger
{
    private readonly TextBox _logDisplayBox;

    public WinFormsLogger(TextBox logBox)
    {
        _logDisplayBox = logBox;
    }

    public void Log(Channel channel, DateTime eventTime, MessageKind kind, string message)
    {
        // 格式化日志内容,包含时间、类型和消息正文
        string logEntry = $"[{eventTime:HH:mm:ss}] [{kind}] {message}{Environment.NewLine}";

        // 跨线程更新UI,避免WinForms线程异常
        _logDisplayBox.Invoke((Action)(() =>
        {
            _logDisplayBox.AppendText(logEntry);
            // 自动滚动到最新日志位置
            _logDisplayBox.SelectionStart = _logDisplayBox.TextLength;
            _logDisplayBox.ScrollToCaret();
        }));
    }
}

2. 在训练流程中接入自定义日志器

初始化MLContext时传入自定义日志实例,并将训练逻辑放在后台线程执行,避免阻塞UI:

using Microsoft.ML;
using System.Threading.Tasks;

private async void btnStartTraining_Click(object sender, EventArgs e)
{
    // 禁用训练按钮防止重复触发
    btnStartTraining.Enabled = false;
    txtLogDisplay.Clear();

    try
    {
        // 绑定日志控件到自定义日志器
        var logger = new WinFormsLogger(txtLogDisplay);
        // 初始化带日志器的MLContext
        var mlContext = new MLContext(seed: 42, logger);

        // 构建数据加载与训练管道(替换为你的实际业务代码)
        var trainingData = mlContext.Data.LoadFromTextFile<YourDetectionData>("training_data.csv", separatorChar: ',');
        var trainingPipeline = mlContext.Transforms.Conversion.MapValueToKey("Label")
            .Append(mlContext.Transforms.Text.FeaturizeText("Features", "ImagePath"))
            .Append(mlContext.ObjectDetection.Trainers.Yolov8())
            .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));

        // 后台线程执行训练,不阻塞UI
        await Task.Run(() =>
        {
            var trainedModel = trainingPipeline.Fit(trainingData);
            // 训练完成后保存模型(可选)
            mlContext.Model.Save(trainedModel, trainingData.Schema, "object_detection_model.zip");
        });

        txtLogDisplay.AppendText($"[{DateTime.Now:HH:mm:ss}] 训练完成!{Environment.NewLine}");
    }
    catch (Exception ex)
    {
        txtLogDisplay.AppendText($"[{DateTime.Now:HH:mm:ss}] 训练出错:{ex.Message}{Environment.NewLine}");
    }
    finally
    {
        btnStartTraining.Enabled = true;
    }
}

3. 关键注意事项

  • UI线程安全:必须通过Invoke方法更新UI控件,否则会触发跨线程操作异常。
  • 日志过滤(可选):如果日志量过大,可在Log方法中通过MessageKind过滤级别(如只保留Info、Warning、Error),减少冗余输出。
  • 后台训练:Fit()方法必须放在后台线程执行,否则WinForms窗口会失去响应,无法实时显示日志。

内容的提问来源于stack exchange,提问作者Ant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 19:36:01