C# 统一的ML.NET
我不知道如何在Unity中使用ML.NET 我所做的: 将我的项目转换为与framework 4.x兼容。 已将api兼容性级别转换为framework 4.x。 创建assets/plugins/ml文件夹,并使用相应的XML放入Microsoft.ml API中。 将所有ml.dlls平台设置标记为仅与86_64兼容(这是冗余的) 我现在可以: 调用ML API,创建MlContext、TextLoader,并对模型进行培训。当一个模型被训练时,我也可以评估训练过的模型,但是 我不能: 尝试从模型中获取预测时,我得到一个错误: (还有一个完整的项目附在那里,你可以看到那里的代码) 同样的代码也适用于VisualStudio解决方案C# 统一的ML.NET,c#,unity3d,compatibility,ml.net,C#,Unity3d,Compatibility,Ml.net,我不知道如何在Unity中使用ML.NET 我所做的: 将我的项目转换为与framework 4.x兼容。 已将api兼容性级别转换为framework 4.x。 创建assets/plugins/ml文件夹,并使用相应的XML放入Microsoft.ml API中。 将所有ml.dlls平台设置标记为仅与86_64兼容(这是冗余的) 我现在可以: 调用ML API,创建MlContext、TextLoader,并对模型进行培训。当一个模型被训练时,我也可以评估训练过的模型,但是 我不能: 尝试
public float TestSinglePrediction(List<double> signal, MLContext mlContext, string modelPath)
{
ITransformer loadedModel;
using (var stream = new FileStream(modelPath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
loadedModel = mlContext.Model.Load(stream);
}
var predictionFunction = loadedModel.MakePredictionFunction<AbstractSignal, PredictedRfd>(mlContext);
var abstractSignal = new AbstractSignal()
{
Sig1 = (float)signal[0],
Sig2 = (float)signal[1],
Sig3 = (float)signal[2],
Sig4 = (float)signal[3],
Sig5 = (float)signal[4],
Sig6 = (float)signal[5],
Sig7 = (float)signal[6],
Sig8 = (float)signal[7],
Sig9 = (float)signal[8],
Sig10 = (float)signal[9],
Sig11 = (float)signal[10],
Sig12 = (float)signal[11],
Sig13 = (float)signal[12],
Sig14 = (float)signal[13],
Sig15 = (float)signal[14],
Sig16 = (float)signal[15],
Sig17 = (float)signal[16],
Sig18 = (float)signal[17],
Sig19 = (float)signal[18],
Sig20 = (float)signal[19],
RfdX = 0
};
var prediction = predictionFunction.Predict(abstractSignal);
return prediction.RfdX;
}
public float TestSinglePrediction(列表信号、MLContext、MLContext、string modelPath)
{
ITransformer加载模型;
使用(var stream=newfilestream(modelPath,FileMode.Open,FileAccess.Read,FileShare.Read))
{
loadedModel=mlContext.Model.Load(流);
}
var predictionFunction=loadedModel.MakePredictionFunction(mlContext);
var abstractSignal=new abstractSignal()
{
Sig1=(浮点)信号[0],
Sig2=(浮动)信号[1],
Sig3=(浮动)信号[2],
Sig4=(浮动)信号[3],
Sig5=(浮动)信号[4],
Sig6=(浮动)信号[5],
Sig7=(浮动)信号[6],
Sig8=(浮动)信号[7],
Sig9=(浮动)信号[8],
Sig10=(浮动)信号[9],
Sig11=(浮动)信号[10],
Sig12=(浮动)信号[11],
Sig13=(浮动)信号[12],
Sig14=(浮动)信号[13],
Sig15=(浮动)信号[14],
Sig16=(浮动)信号[15],
Sig17=(浮动)信号[16],
Sig18=(浮动)信号[17],
Sig19=(浮动)信号[18],
Sig20=(浮动)信号[19],
RfdX=0
};
var预测=预测函数。预测(抽象信号);
返回预测.RfdX;
}
这是返回错误行的方法:
var-predictionFunction=loadedModel.MakePredictionFunction(mlContext)代码>从Unity 2018.1开始,Unity可以针对.net 4.x。因此,您需要将.net版本设置为.net 4.x等效版本或.net standard 2.0(),并确保在visual studio中将dll作为引用添加到项目中。如果你不把它作为参考添加,那么VisualSudio就不知道了。正如Nick在他的帖子**中所说,如果你遵循这些步骤,它应该是统一的
然而,在我写这篇文章的时候,ML.NET团队还没有使用Unity进行全面的测试,所以它没有开箱即用并不完全令人惊讶。已在上打开。我建议密切关注这个问题,了解团结支持的状况
**尼克:
从Unity 2018.1开始,Unity可以瞄准.net 4.x。因此,您需要将.net版本设置为.net 4.x等效版本或.net标准2.0(https://blogs.unity3d.com/2018/03/28/updated-scripting-runtime-in-unity-2018-1-what-does-the-future-hold/)并确保将dll作为visual studio中的引用添加到项目中。如果不将其添加为引用,则VisualSudio不知道。
下面是一个稍加修改的Iris示例(由于某些ML API更改,该示例不再工作)
首先确保安装了最新的.net版本,并且Unity版本至少为2019.2.0f1(这是预览版本)或更高版本
克雷斯特是一个新的联合项目。在资产文件夹中创建一个插件文件夹。将所有ML.Net API导入该文件夹(这可能是一件愚蠢的事情,但我已经正手创建了一个visual studio soution,并通过nuget将所有这些API添加到该解决方案中,而不仅仅是将这些dll文件复制到unity项目中的Assets/Plugins文件夹中)
在“资源”文件夹中创建一个数据文件夹,并将iris.Data文件从中粘贴到其中
创建名为MLuTest的脚本并将以下代码粘贴到其中:
公共类MLuTest:单一行为{
static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Assets", "Data", "iris.data");
static readonly string _modelPath = Path.Combine(Environment.CurrentDirectory, "Assets", "Data", "IrisClusteringModel.zip");
MLContext mlContext;
void Start()
{
Debug.Log("starting...");
mlContext = new MLContext(seed: 0);
IDataView dataView = mlContext.Data.ReadFromTextFile<IrisData>(_dataPath, hasHeader: false, separatorChar: ',');
string featuresColumnName = "Features";
var pipeline = mlContext.Transforms
.Concatenate(featuresColumnName, "SepalLength", "SepalWidth", "PetalLength", "PetalWidth")
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName, clustersCount: 3));//read and format flowery data
var model = pipeline.Fit(dataView);//train
using (var fileStream = new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))//save trained model
{
mlContext.Model.Save(model, fileStream);
}
var predictor = mlContext.Model.CreatePredictionEngine<IrisData, ClusterPrediction>(model);//predict
IrisData Setosa = new IrisData
{
SepalLength = 5.1f,
SepalWidth = 3.5f,
PetalLength = 1.4f,
PetalWidth = 0.2f
};
Debug.Log(predictor.Predict(Setosa).PredictedClusterId);
Debug.Log("...done predicting, now do what u like with it");
}
}
public class IrisData
{
[LoadColumn(0)]
public float SepalLength;
[LoadColumn(1)]
public float SepalWidth;
[LoadColumn(2)]
public float PetalLength;
[LoadColumn(3)]
public float PetalWidth;
}
public class ClusterPrediction
{
[ColumnName("PredictedLabel")]
public uint PredictedClusterId;
[ColumnName("Score")]
public float[] Distances;
}
静态只读字符串_dataPath=Path.Combine(Environment.CurrentDirectory,“资产”、“数据”、“iris.Data”);
静态只读字符串_modelPath=Path.Combine(Environment.CurrentDirectory,“Assets”、“Data”、“IrisClusteringModel.zip”);
MLContext-MLContext;
void Start()
{
Log(“启动…”);
mlContext=新的mlContext(种子:0);
IDataView dataView=mlContext.Data.ReadFromTextFile(_dataPath,hashreader:false,separatorChar:',');
字符串特征ColumnName=“特征”;
var pipeline=mlContext.Transforms
.连接(功能列名称,“分隔长度”、“分隔宽度”、“分隔长度”、“分隔宽度”、“分隔宽度”)
.Append(mlContext.Clustering.Trainers.KMeans(featuresColumnName,clustersCount:3));//读取和格式化华丽的数据
var model=pipeline.Fit(dataView);//train
使用(var fileStream=newfilestream(_modelPath,FileMode.Create,FileAccess.Write,FileShare.Write))//保存经过培训的模型
{
mlContext.Model.Save(Model,fileStream);
}
var predictor=mlContext.Model.CreatePredictionEngine(Model);//预测
IrisData Setosa=新IrisData
{
分离长度=5.1f,
分离宽度=3.5f,
花瓣长度=1.4f,
花瓣宽度=0.2f
};
Log(predictor.Predict(Setosa.PredictedClusterId);
Log(“…完成预测,现在用它做你喜欢的事情”);
}
}
公共类IrisData
{
[加载列(0)]
公共浮动分离长度;
[第(1)栏]
公共浮动分离宽度;
[第(2)栏]
公众漂浮长度;
[第(3)栏]
公众漂浮花瓣宽度;
}
公共类聚类预测
{
[ColumnName(“PredictedLabel”)]
公共uint预测聚类;
[栏目名称(“分数”)]
公共交通距离;
}
这应该是开箱即用的。