ML. Net работает на Xamarin. Android, но не на Xamarin. iOS: System.Reflection.Emit - PullRequest
1 голос
/ 02 февраля 2020

У меня есть решение .NETStandard 2.1, в котором запущено решение Xamarin.Forms. При попытке выполнить некоторую работу по ML (прогнозирование аномалий) я получаю исключение времени выполнения ТОЛЬКО в Xamarin. iOS.

System.PlatformNotSupportedException с сообщением, что «Операция не поддерживается на этой платформе». Вот мой код:

// Dataset for ML
var amounts = new int[] { 100, 150, 200, 300, 250, 3000, 100, 250, 300, 250 };
var withdrawals = amounts.Select(amount => new Withdrawal { Amount = amount }).ToList();

// Instantiate ML context
var mlContext = new Microsoft.ML.MLContext();

// Create you algorithm
var estimator = mlContext.Transforms.DetectIidSpike( // "using ML;" needed for this statement
    outputColumnName: nameof(Prediction.Output),
    inputColumnName: nameof(Withdrawal.Amount),
    confidence: 99,
    pvalueHistoryLength: amounts.Length/2);

// Link data to algorithm
var amountsData = mlContext.Data.LoadFromEnumerable(withdrawals); // <=THE LINE THROWING THE EXCEPTION
var transformedAmountsData = estimator.Fit(amountsData).Transform(amountsData);

// Create output
var predictions = mlContext.Data.CreateEnumerable<Prediction>(transformedAmountsData, reuseRowObject:false).ToList();

foreach (var prediction in predictions)
{
    var isAnomaly = prediction.Output[0];
    var originalValue = prediction.Output[1];
    var confidenceLevel = prediction.Output[2];
    Console.WriteLine($"{originalValue} {confidenceLevel} {isAnomaly}");
}

А это два объекта модели:

class Withdrawal
{
    public float Amount { get; set; }
}

class Prediction
{
    [Microsoft.ML.Data.VectorType]
    public double[] Output { get; set; }
}

Вот трассировка стека:

at System.Reflection.Emit.DynamicMethod..ctor (System.String name, System.Type returnType, System.Type[] parameterTypes, System.Type owner, System.Boolean skipVisibility) [0x00006] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/corlib/System.Reflection.Emit/DynamicMethod.notsupported.cs:64 \n at Microsoft.ML.ApiUtils.GeneratePeek[TOwn,TRow,TValue] (System.Reflection.PropertyInfo propertyInfo, System.Reflection.Emit.OpCode assignmentOpCode) [0x00040] in <ac1708cf77ce4a63b733a786896eec8e>:0 \n at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.InternalInvoke(System.Reflection.RuntimeMethodInfo,object,object[],System.Exception&)\n at System.Reflection.RuntimeMethodInfo.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x0006a] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/corlib/System.Reflection/RuntimeMethodInfo.cs:395

I из официального Xamarin. iOS docs понимаем, что System.Reflection.Emit не поддерживается. Поэтому мой вопрос в том, можно ли как-нибудь сделать эту работу?

Я знаю книгу Xamarin Джонатана Пепперса, упоминает , чтобы использовать «NO_LCG» в поле «Определить символы», чтобы получить избавиться от той же ошибки и заставить Ninject работать на Xamarin. iOS. Это не сработало для этого случая, но есть ли что-то похожее на go вокруг него?

1 Ответ

1 голос
/ 02 февраля 2020

Я не мог понять, откуда ты это взял!

Если вы выполните mtouch самостоятельно, вы можете найти ряд параметров, которые плохо документированы в стандартных руководствах Microsoft, и для «экспериментальных» функций это вдвойне верно:

mtouch --help

переводчик:

  --interpreter[=VALUE]  Enable the *experimental* interpreter. Optionally
                           takes a comma-separated list of assemblies to
                           interpret (if prefixed with a minus sign, the
                           assembly will be AOT-compiled instead). 'all'
                           can be used to specify all assemblies. This
                           argument can be specified multiple times.
...