Для тех, кто пытается это сделать, у меня есть рабочее решение, которое создает схему и может использоваться для динамического обучения данных.
Сначала возьмите код для DynamicTypeProperty и DynamicType из моего другого ответа здесь .
Следующий код создаст схему динамически:
var properties = new List<DynamicTypeProperty>()
{
new DynamicTypeProperty("SepalLength", typeof(float)),
new DynamicTypeProperty("SepalWidth", typeof(float)),
new DynamicTypeProperty("PetalLength", typeof(float)),
new DynamicTypeProperty("PetalWidth", typeof(float)),
};
// create the new type
var dynamicType = DynamicType.CreateDynamicType(properties);
var schema = SchemaDefinition.Create(dynamicType);
Затем вам нужно будет создать список с необходимыми данными.Это делается следующим образом:
var dynamicList = DynamicType.CreateDynamicList(dynamicType);
// get an action that will add to the list
var addAction = DynamicType.GetAddAction(dynamicList);
// call the action, with an object[] containing parameters in exact order added
addAction.Invoke(new object[] {1.1, 2.2, 3.3, 4.4});
// call add action again for each row.
Затем вам нужно создать IDataView с данными, для этого нужно использовать отражение, иначе тренеры не определят правильный тип.
var mlContext = new MLContext();
var dataType = mlContext.Data.GetType();
var loadMethodGeneric = dataType.GetMethods().First(method => method.Name =="LoadFromEnumerable" && method.IsGenericMethod);
var loadMethod = loadMethodGeneric.MakeGenericMethod(dynamicType);
var trainData = (IDataView) loadMethod.Invoke(mlContext.Data, new[] {dynamicList, schema});
Тогда вы сможете запустить trainData
через свой конвейер.
Удачи.