对于机器学习,特别是对Microsoft ML.NET,我是一个新手。 我正在尝试做的是创建一个可重新训练的文本分类模型。 假设我有一条文章(用于培训)和一条文章预测(用于分类):
public class Article
{
public string Text { get; set; }
public string Topic { get; set; }
}
public class ArticlePrediction
{
public float[] Score { get; set; }
public uint PredictedLabel { get; set; }
}
在documentation和可重训练模型this GitHub issue之后,我得出结论,我将需要两个管道-准备管道和训练管道。并为“准备好的”数据建立一个单独的中间模型,以便进行重新训练:
public class ArticlePrepared : Article
{
[VectorType(???)]
public float[] Features { get; set; }
public uint Label { get; set; }
}
模型的实际训练很简单:
public static void Train(MLContext ctx, IDataView data)
{
var prepPipeline = ctx.Transforms.Conversion.MapValueToKey("Label", "Topic")
.Append(ctx.Transforms.Text.FeaturizeText("Features", "Text"));
var trainPipeline = ctx.MulticlassClassification.Trainers
.LbfgsMaximumEntropy("Label", "Features", historySize: 50, l1Regularization: 0.1f);
var prepModel = prepPipeline.Fit(data);
var prepData = prepModel.Transform(data);
var trainModel = trainPipeline.Fit(prepData);
ctx.Model.Save(prepModel, data.Schema, PreparationPipelinePath);
ctx.Model.Save(trainModel, prepData.Schema, TrainingPipelinePath);
}
再培训部分是我一直在努力的部分,现在我怀疑这是否可能:
public static void Retrain(MLContext ctx, Article article)
{
var prepModel = ctx.Model.Load(PreparationPipelinePath, out var _);
var retrainModel = ctx.Model.Load(TrainingPipelinePath, out var _) as ISingleFeaturePredictionTransformer<object>;
var modelParams = (MaximumEntropyModelParameters)retrainModel.Model;
var prepData = prepModel.Transform(ctx.Data.LoadFromEnumerable(new[] { article }));
var retrainedModel = ctx.MulticlassClassification.Trainers
.LbfgsMaximumEntropy("Label", "Features", historySize: 50, l1Regularization: 0.1f)
.Fit(prepData, modelParams); // boom!
ctx.Model.Save(retrainedModel, prepData.Schema, TrainingPipelinePath);
}
收到的异常是未找到有效的训练实例,所有实例均缺少功能。 我有几个问题:
在我看来,文本中的每个单词都将转换为模型特征。这意味着当我尝试使用新的Article
重新训练模型时,训练后的模型并不具有该新Article
的所有功能(因为新文本,我想使用, 是不同的)。这是我收到例外的原因吗?
在使文本具有特色时,无法判断准备好的ArticlePrepared
模型应具有多少个功能(即VectorType
属性的大小或{ {1}}数组属性)。可以使用动态数量的功能吗?如果检查GitHub存储库(下面的链接),您会看到Features
的大小为131,但这是从已保存的架构中获取的硬编码值。不用说,这种硬编码在现实情况下是行不通的。
我创建了一个GitHub repository,可用于重现该问题。
是否有办法去做我想做的事情,或者我走的方向完全错误?任何帮助或见解都将受到赞赏。