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} 不是带有槽名的向量类型"); }
为什么这样改?
- 先做了列存在性检查,避免后续空引用的问题
- 明确判断列的类型是
VectorType——这是ML.NET对数组/向量列的类型定义 - 通过
vectorType.GetSlotNames()获取槽名,这才是向量列获取标签的正确方式,能拿到你训练时的三个分类标签,对应Score数组里的每个元素
这样调整后,你就能正确映射每个Score值对应的分类标签了。
内容的提问来源于stack exchange,提问作者ggeorge
相关产品推荐
相关产品推荐

