Podstawowe uczenie maszynowe 2 na platformie Xamarin.iOS

Core ML to technologia uczenia maszynowego dostępna w systemach iOS, macOS, tvOS i watchOS. Umożliwia ona aplikacjom przewidywanie na podstawie modeli uczenia maszynowego.

W systemie iOS 12 core ML zawiera interfejs API przetwarzania wsadowego. Ten interfejs API sprawia, że usługa Core ML jest wydajniejsza i zapewnia ulepszenia wydajności w scenariuszach, w których model jest używany do tworzenia sekwencji przewidywań.

Przykładowa aplikacja: MarsHabitatCoreMLTimer

Aby zademonstrować przewidywania wsadowe za pomocą podstawowego uczenia maszynowego, zapoznaj się z przykładową aplikacją MarsHabitatCoreMLTimer . W tym przykładzie użyto modelu Core ML wyszkolonego do przewidywania kosztów budowy siedliska na Marsie na podstawie różnych danych wejściowych: liczby paneli słonecznych, liczby gazów cieplarnianych i liczby akrów.

Fragmenty kodu w tym dokumencie pochodzą z tego przykładu.

Generowanie danych przykładowych

W ViewControllerpliku przykładowa aplikacja wywołuje metodę ViewDidLoadLoadMLModel, która ładuje dołączony model uczenia maszynowego Core ML:

void LoadMLModel()
{
    var assetPath = NSBundle.MainBundle.GetUrlForResource("CoreMLModel/MarsHabitatPricer", "mlmodelc");
    model = MLModel.Create(assetPath, out NSError mlErr);
}

Następnie przykładowa aplikacja tworzy 100 000 MarsHabitatPricerInput obiektów do użycia jako dane wejściowe dla sekwencyjnych przewidywań uczenia maszynowego Core ML. Każda wygenerowana próbka ma losową wartość ustawioną dla liczby paneli słonecznych, liczby gazów cieplarnianych i liczby akrów:

async void CreateInputs(int num)
{
    // ...
    Random r = new Random();
    await Task.Run(() =>
    {
        for (int i = 0; i < num; i++)
        {
            double solarPanels = r.NextDouble() * MaxSolarPanels;
            double greenHouses = r.NextDouble() * MaxGreenHouses;
            double acres = r.NextDouble() * MaxAcres;
            inputs[i] = new MarsHabitatPricerInput(solarPanels, greenHouses, acres);
        }
    });
    // ...
}

Naciśnięcie dowolnego z trzech przycisków aplikacji wykonuje dwie sekwencje przewidywań: jedną przy użyciu pętli, a drugą for przy użyciu nowej metody wsadowej GetPredictions wprowadzonej w systemie iOS 12:

async void RunTest(int num)
{
    // ...
    await FetchNonBatchResults(num);
    // ...
    await FetchBatchResults(num);
    // ...
}

dla pętli

Wersja for pętli testu naiwnie iteruje określoną liczbę danych wejściowych, wywołując GetPrediction dla każdego i odrzucając wynik. Metoda określa, jak długo trwa przewidywanie:

async Task FetchNonBatchResults(int num)
{
    Stopwatch stopWatch = Stopwatch.StartNew();
    await Task.Run(() =>
    {
        for (int i = 0; i < num; i++)
        {
            IMLFeatureProvider output = model.GetPrediction(inputs[i], out NSError error);
        }
    });
    stopWatch.Stop();
    nonBatchMilliseconds = stopWatch.ElapsedMilliseconds;
}

GetPredictions (nowy interfejs API wsadowy)

Wersja wsadowa testu tworzy MLArrayBatchProvider obiekt z tablicy wejściowej (ponieważ jest to wymagany parametr wejściowy dla GetPredictions metody), tworzy obiekt MLPredictionOptions obiekt, który uniemożliwia ograniczenie obliczeń przewidywania do procesora CPU i używa interfejsu GetPredictions API do pobierania przewidywań, ponownie odrzucając wynik:

async Task FetchBatchResults(int num)
{
    var batch = new MLArrayBatchProvider(inputs.Take(num).ToArray());
    var options = new MLPredictionOptions()
    {
        UsesCpuOnly = false
    };

    Stopwatch stopWatch = Stopwatch.StartNew();
    await Task.Run(() =>
    {
        model.GetPredictions(batch, options, out NSError error);
    });
    stopWatch.Stop();
    batchMilliseconds = stopWatch.ElapsedMilliseconds;
}

Wyniki

Zarówno w symulatorze, jak i na urządzeniu GetPredictions , kończy się szybciej niż przewidywania core ML oparte na pętli.