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

ML.Net分数与标签关联报错:调用GetValue时出现无效操作异常

解决ML.NET调用GetSlotNames时的InvalidOperationException错误

看起来你在尝试获取三分类模型Score列的槽名(也就是每个分数对应的分类标签)时踩了个坑,这个Invalid call to 'GetValue'异常是因为处理向量列的方式不对。

问题根源

你的Score列对应ModelOutput里的float[],属于ML.NET中的向量类型列。直接调用column.Value.GetSlotNames并不适用于这种类型,向量列的槽名需要从列的类型元数据(VectorType)中获取,而不是直接通过Column对象调用这个方法。

修正后的代码

把你的GetSlotNames方法改成这样就能正常工作了:

public static List<string> GetSlotNames(string name)
{
    var schema = predEngine.OutputSchema;
    var column = schema.GetColumnOrNull(name);
    
    if (!column.HasValue)
    {
        throw new ArgumentException($"找不到名为 {name} 的列");
    }
    
    // 确认当前列是向量类型
    if (column.Value.Type is VectorType vectorType)
    {
        // 从向量类型元数据中获取槽名
        if (vectorType.GetSlotNames() is VBuffer<ReadOnlyMemory<char>> slotNames)
        {
            var names = new string[slotNames.Length];
            int index = 0;
            foreach (var denseValue in slotNames.DenseValues())
            {
                names[index++] = denseValue.ToString();
            }
            return names.ToList();
        }
    }
    
    throw new InvalidOperationException($"列 {name} 不是带有槽名的向量类型");
}

为什么这样改?

  1. 先做了列存在性检查,避免后续空引用的问题
  2. 明确判断列的类型是VectorType——这是ML.NET对数组/向量列的类型定义
  3. 通过vectorType.GetSlotNames()获取槽名,这才是向量列获取标签的正确方式,能拿到你训练时的三个分类标签,对应Score数组里的每个元素

这样调整后,你就能正确映射每个Score值对应的分类标签了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:29:59