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ń.
Generowanie danych przykładowych
W ViewController
pliku przykładowa aplikacja wywołuje metodę ViewDidLoad
LoadMLModel
, 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.