Hoe een Core ML-model voor een iOS-app te trainen

Wat je gaat creëren

Core ML maakt het gemakkelijk voor iOS-ontwikkelaars om deep machine learning aan hun apps toe te voegen. In dit bericht laat ik je zien hoe je een Core ML-model kunt trainen om intelligente inzichten af ​​te leiden.

Machine learning is het afgelopen jaar ongetwijfeld een van de populairste onderwerpen geweest, waarbij bedrijven van allerlei aard probeerden hun producten intelligenter te maken om gebruikerservaringen te verbeteren en hun aanbod te differentiëren. Google investeerde vorig jaar alleen al tussen $ 20 miljard en $ 30 miljard aan kunstmatige intelligentie, volgens McKinsey's State Of Machine Learning en AI, 2017. 

AI wordt een race voor patenten en intellectueel eigendom (IP) tussen 's werelds toonaangevende technologiebedrijven ... In het rapport worden veel voorbeelden van interne ontwikkeling genoemd, waaronder Amazon's investeringen in robotica en spraakherkenning, en Salesforce op virtuele agenten en machine learning. BMW, Tesla en Toyota leiden autofabrikanten in hun investeringen in robotica en machine learning voor gebruik in auto's zonder bestuurder. Toyota is van plan $ 1 miljard te investeren in de oprichting van een nieuw onderzoeksinstituut dat zich toelegt op AI voor robotica en voertuigen zonder bestuurder. (Bron: Forbes)

Apple is geen uitzondering op deze trend en heeft machinaal leren gebruikt in zijn eigen apps. De Photos-app voor iOS kan bijvoorbeeld gezichten, objecten en oriëntatiepunten herkennen en Siri leidt intentie en betekenis uit spraak. Berichten voor iOS suggereren en voorspellen op intelligente wijze woorden gebaseerd op eerder gedrag van gebruikers. 

In deze tutorial leert u hoe u machineleeralgoritmen kunt toepassen op een set trainingsgegevens om een ​​getraind model te maken dat vervolgens voorspellingen doet op basis van nieuwe invoer. Allemaal dankzij het nieuwe Core ML-raamwerk van Apple. 

Doel van deze zelfstudie

In deze zelfstudie leer je een deel van het computeronderwijs. Je traint en integreert een machine-leermodel in een eenvoudige iOS-app, met behulp van een populair algoritmekader voor diepgaand leren. In deze tutorial, zult u:

  • leer enkele van de standaard machine learning concepten 
  • train uw model met behulp van voorbeeldgegevens
  • integreer het getrainde model in een iOS-app

Nadat we de NLP-theorie hebben doorlopen, zullen we onze kennis in de praktijk brengen door een eenvoudige Twitter-client te doorlopen en tweetberichten te analyseren. Ga je gang en klop de GitHub-repo van de tutorial en bekijk de definitieve versie van de app die we helemaal opnieuw zullen maken. 

Aangenomen kennis

Deze tutorial gaat ervan uit dat je een ervaren iOS-ontwikkelaar bent, maar hoewel je met machine learning aan het werken bent, hoef je geen achtergrondinformatie over het onderwerp te hebben. U zult een beetje Python gebruiken om uw getrainde model te maken, maar u kunt het voorbeeld van de handleiding zonder voorafgaande kennis van Python volgen. 

Machine learning 101

Het doel van machine learning is dat een computer taken doet zonder expliciet geprogrammeerd te zijn om dit te doen - het vermogen om autonoom te denken of te interpreteren. Een opvallende eigentijdse use-case is autonoom rijden: auto's de mogelijkheid bieden om hun omgeving visueel te interpreteren en zonder hulp te rijden. 

Machine learning wordt vandaag door grote bedrijven gebruikt om betere zakelijke beslissingen te nemen op basis van historische gegevens, door middel van deep learning-algoritmen om patronen en correlaties te identificeren, waardoor ze betere voorspellingen van de toekomst kunnen doen. U kunt bijvoorbeeld problemen oplossen zoals "Hoe waarschijnlijk is het dat een specifieke klant een specifiek product of een specifieke service koopt?" Met meer vertrouwen op basis van voorafgaand gedrag. 

Machinaal leren kan het beste worden toegepast op problemen met een geschiedenis van antwoorden, zoals u later in deze handleiding zult ontdekken wanneer we ons voorbeeldprobleem doornemen. Een voorbeeld van machinaal leren in actie zou uw e-mail spamfilter zijn, dat gebruikmaakt van gesuperviseerd leren (terwijl u items markeert als spam of niet) om spam beter te filteren in de loop van de tijd. Het machine-leermodel codeert al deze kennis over resultaten uit het verleden en maakt het beschikbaar voor het algoritme voor efficiënt gebruik tijdens runtime.

Het klinkt misschien allemaal een beetje overweldigend in het begin, maar het is niet ingewikkeld en ik zal je laten zien hoe je binnenkort een getraind model kunt maken. Als u eenmaal een getraind model via een algoritme hebt bedacht, converteert u het vervolgens naar een model dat kan worden gebruikt door iOS, dankzij Core ML.

Core ML is nieuw voor de SDK-familie van Apple, geïntroduceerd als onderdeel van iOS 11, zodat ontwikkelaars een breed scala aan machine-leermodi en deep learning-laagtypen kunnen implementeren. 

Natural Language Processing (NLP) zit logischerwijze in het Core ML-framework naast twee andere krachtige bibliotheken, Vision en GameplayKit. Vision biedt ontwikkelaars de mogelijkheid om computer vision-machine learning te implementeren om dingen te bereiken zoals het detecteren van gezichten, oriëntatiepunten of andere objecten, terwijl GameplayKit game-ontwikkelaars tools biedt voor het schrijven van spellen en specifieke gameplay-functies. 

Het voordeel van Core ML ten opzichte van andere oplossingen is dat Apple het leren van de machine op het apparaat heeft geoptimaliseerd, wat een lager energieverbruik van het geheugen en een lagere latentie betekent. Dit containert ook gebruikersinformatie binnen het apparaat, waardoor de privacy wordt verbeterd.

Met een overzicht van machine learning en modellen uit de weg, laten we de theorie in praktijk brengen door uw eerste trainingsmodel te maken. 

Je model trainen

Om een ​​model nuttig te laten zijn, moet het worden getraind om gegevens te herkennen als informatie die het vervolgens kan gebruiken om voorspellingen met een geschikt algoritme af te dwingen. Core ML ondersteunt momenteel de volgende typen modellen:

Naast het aanwijzen van een algoritme, hoe meer gegevens u heeft, hoe beter uw model zal worden getraind en hoe nauwkeuriger de voorspellingen zullen zijn. Voordat we beginnen met het maken van ons Core ML-model, laten we eens kijken naar de voorbeeld-app waarmee we gaan werken, en in het bijzonder de voorbeeldgegevens. 

Voorbeeldapp: Las Vegas Hotel Score Predictor

Voor deze zelfstudie gebruiken we een open verzameling gegevens over hotelrecensies in de Las Vegas Strip, die ik heb gekocht bij de UCI om te illustreren hoe een model moet worden getraind en hoe correlaties kunnen worden berekend. U kunt een kijkje nemen naar het volledige door komma's gescheiden CSV-bestand dat we in onze app zullen gebruiken. De structuur van de gegevens is als volgt:

Nr. beoordelingen, Nr. hotel beoordelingen, Score, Hotel naam, Hotel sterren 11, 4, 5, Circus Circus Hotel & Casino Las Vegas, 3 119, 21, 3, Circus Circus Hotel & Casino Las Vegas, 3 ... 

We zijn geïnteresseerd in het voorspellen van hotelsterrenbeoordelingen voor hotels op basis van de correlatie van het aantal hotelbeoordelingen en algemene beoordelingen voor elk specifiek hotel, wat een vrij goed voorbeeld is, maar eenvoudig genoeg om het concept van het trainen van een model met duidelijke gegevens. 

Download het door komma's gescheiden CSV-bestand naar een nieuwe map die u voor deze oefening gaat gebruiken. Laten we nu onze handen vies maken met een Python, met als doel het volgende te bereiken: 

  • het importeren van de nodige bibliotheken, inclusief de Python Core ML-bibliotheken
  • het importeren van onze voorbeeldgegevens
  • het toepassen van een lineair regressie-algoritme op onze gegevens, met behulp van een bibliotheek genaamd SciKit
  • het identificeren van de kolommen in de gegevens die we willen modelleren (Nr. beoordelingen, Nr. hotel beoordelingen, Hotelsterren)
  • identificeren van de kolom die hij mogelijk beïnvloedt (partituur
  • het ombouwen van het getrainde model in een Core ML-model

Het kan lijken alsof er nogal wat stappen zijn, maar het is niet zo ontmoedigend als je misschien denkt. De Python-code die we hierna zullen aantonen zal niet moeilijk te volgen zijn, ongeacht je ervaring met de taal. 

Eerst gaan we onze vereiste modules en afhankelijkheden instellen, waaronder SciKit, coremltools (de officiële Core ML-tools van Apple voor Python) en panda's, een krachtige tool voor analyse van gegevensstructuren. 

Open een terminalvenster, navigeer naar de projectmap waar u het CSV-bestand hebt en voer het volgende in:

sudo -H pip install --ignore-installed coremltools scikit-learn pandas

Gebruik vervolgens een editor van uw keuze om een ​​nieuwe te maken .py bestand, en noem het zoiets als convert_reviews.py, de volgende regels toevoegen om de bibliotheken te importeren die u gaat gebruiken:

van sklearn.linear_model importeer LinearRegression import pandas import coremltools 

Direct na de importinstructies, voeg het volgende toe:

data = pandas.read_csv ("LasVegas-Trip-Dataset.csv") # (1) Importeer CSV-bestand model = LinearRegression () # (2) Pas lineaire regressie afdrukken toe (gegevens) model.fit (data [["Nr. beoordelingen "," Nr. Hotelrecensies "," Hotelsterren "]], data [" Score "]) # (3) Gegevens om te extrapoleren

Tot nu toe importeren we gewoon de CSV met behulp van het pandaskader, drukken de geïmporteerde gegevens af naar het scherm en gebruiken dan het SciKit-framework om een ​​lineair regressie-algoritme vast te stellen om toe te passen op de kolommen die we interessant vinden om te extrapoleren. 

Maak je niet al te veel zorgen over wat een lineair regressie-algoritme betekent, maar weet gewoon dat we een eenvoudige algoritme-modelleringstechniek gebruiken om voorspellingen te doen. In dit project zijn we geïnteresseerd in hoe dit van invloed is op de score van ons hotel, dat we zojuist hebben vastgesteld met behulp van de model.fit functie. 

We hebben nu ons getrainde model, maar we moeten het nog steeds omzetten naar een model dat Core ML kan gebruiken, en dat is waar coremltools binnenkomt. Voeg de volgende regels toe:

coreml_model = coremltools.converters.sklearn.convert (model, ["aantal beoordelingen", "aantal hotelrecensies", "hotelsterren"], "score") # (4) Coreml_model.save ("Vegas_Reviews.mlmodel" converteren ) # (5) Exporteren naar een CoreML-modelobject

De laatste twee regels zetten uw model om in een Core ML-compatibel model voordat u het resultaat opslaat als een .mlmodel object, klaar om te worden gebruikt in uw Xcode-project. Sla het Python-script op en voer het uit via terminal:

python convert_reviews.py

Ervan uitgaande dat je nog geen fouten hebt aangetroffen, de  Vegas_Reviews.mlmodel bestand wordt gegenereerd en uw getrainde model klaargemaakt om in Xcode te worden geïmporteerd. 

Integratie van het getrainde model

Voor het tweede deel van deze zelfstudie gaat u een eenvoudige app maken met een enkele weergavecontroller, een paar schuifregelaars en een segmentbesturingselement waarmee gebruikers verschillende waarden kunnen omschakelen, zodat u verschillende Core ML-voorspellingen kunt observeren. De laatste app ziet er als volgt uit:

Maak in Xcode een nieuwe Single View-app Swift-project en geef het een naam.

Zorg er vervolgens voor dat je de gegenereerde hebt opgenomen Vegas_Reviews.mlmodel bestand in uw project, door het naar uw navigatieprojectvenster te slepen.

Open nu de ViewController.swift bestand en voeg het volgende toe:

class ViewController: UIViewController laat beoordelingen = Vegas_Reviews () @IBOutlet zwakke var stackView: UIStackView! @IBOutlet weak var score Waarde: UILabel! @IBOutlet weak var nrReviews: UISlider! @IBOutlet weak var nrHotelReviews: UISlider! @IBOutlet zwakke var sterren: UISegmentedControl!

Het eerste dat u doet, is een exemplaar van ons model maken, dat u later in de klas zult gebruiken om voorspellingen te doen. Je maakt er ook een paar IBOutlet variabelen die je binnenkort in het storyboard zult opnemen, die map naar de individuele modeleigenschappen waarmee we willen spelen.

Schakel over naar Storyboard en voeg de corresponderende besturingselementen toe die we in je view-controller hebben gedeclareerd, en zorg ervoor dat je elk besturingselement aansluit op de view-controller:

Schakel terug naar de ViewController.swift bestand en voeg het volgende toe @IBAction methode: 

@IBAction func makePrediction (_ sender: Any) letnrReviewsSelected = Double (nrReviews.value) let nrHotelReviewsSelected = Double (nrHotelReviews.value) var starsSelected: Double switch stars.selectedSegmentIndex case 0: return 3.0 case 1: return 4.0 case 2: retourneer 5.0 standaard: retourneer 5.0 als voorspellingen = proberen? self.reviews.prediction (Nr__reviews: nrReviewsSelected, Nr__hotel_reviews: nrHotelReviewsSelected, Hotel_stars: starsSelected) let scoreFormatter = NumberFormatter () scoreFormatter.numberStyle = .decimal scoreFormatter.maximumFractionDigits = 1 self.scoreValue.text = scoreFormatter.string (voor: voorspellingen. Score) else print ("Fout")

Dit is de primaire functionele code van onze voorspellingsmachine, dus laten we deze methode stapsgewijs analyseren. We hebben eerst de verschillende bedieningselementen in de Dubbele type, die als argumenten worden doorgegeven wanneer we onze voorspellingsmethode noemen. Binnen een proberen? blokkeren, bellen self.reviews.prediction (), Dit is een automatisch gegenereerde methode behorende bij ons model, samen met de verwachte eigenschappen die we hebben gedefinieerd bij het importeren van ons getraind model.

Het resultaat van het voorspellingsblok wordt vervolgens doorgegeven aan het label ScoreValue, om weer te geven in uw app. We zijn bijna klaar - schakel gewoon nog een keer terug naar het storyboard en breng elk besturingselement in kaart valueChanged: eigendom van de @IBAction methode die we hebben gemaakt in de view-controller. U wilt dat deze methode wordt aangeroepen elke keer dat u een schuifregelaar of segmentwaarde wijzigt. En voor een goede maatregel kun je er ook voor zorgen dat je deze methode automatisch in je viewDidLoad () methode zodat deze meteen vanaf het begin wordt bijgewerkt:

override func viewDidLoad () super.viewDidLoad () self.makePrediction (self)

Bouw de app in Xcode en voer deze uit, en in de Simulator, schakelt u de verschillende schuifregelaars en observeert u de score-voorspelling terwijl deze verandert op basis van de andere attributiefactoren van het aantal hotelrecensies en recensies in het algemeen. 

Zoals eerder benadrukt, is dit inderdaad een gekunsteld voorbeeld, maar het geeft je een idee van hoe je je eigen experimenten kunt samenstellen om te correleren, en wat nog belangrijker is, hoe eenvoudig het is om getrainde modellen in iOS te implementeren.. 

Conclusie

Dankzij Core ML in iOS 11 heeft Apple het voor alledaagse ontwikkelaars gemakkelijk gemaakt om zonder achtergrond in deep learning intelligentie toe te voegen aan hun apps. Alle verwerking gebeurt op het apparaat en zorgt voor betere prestaties zonder de privacyaspecten van het opslaan van gegevens in de cloud. Omdat Apple voorheen 'dog-fooding' was, was het de machine-leerimplementatie op ingebouwde apps zoals Foto's en Mail. Ontwikkelaars van derden hebben nu de mogelijkheid om patronen, afbeeldingen en tekstuele intenties te herkennen met slechts een paar regels code. 

Dit is ongetwijfeld slechts het begin van de Core ML-beweging van Apple, maar het is een geweldige kans voor ontwikkelaars om meer holistisch over gegevens te denken. Met Core ML kunnen we gebruikers betere gebruikerservaringen bieden en productmanagers meer inzicht bieden in het gedrag van gebruikers. 

Terwijl je hier bent, bekijk enkele van onze andere berichten over de ontwikkeling van iOS-apps en machine learning!