Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一的ML.NET_C#_Unity3d_Compatibility_Ml.net - Fatal编程技术网

C# 统一的ML.NET

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,并对模型进行培训。当一个模型被训练时,我也可以评估训练过的模型,但是 我不能: 尝试

我不知道如何在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解决方案

 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预测聚类;
    [栏目名称(“分数”)]
    公共交通距离;
    }
    
  • 这应该是开箱即用的。