Ein Angebot von

Machine Learning mit Python: Einführung in Amazon SageMaker

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell.
Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell. (Bild: Drilling / Jupyter)

Amazon SageMaker ist ein von AWS vollständig verwalteter Service, der den gesamten Workflow von Machine Learning abdeckt. Anhand der SageMaker-Demo von AWS illustrieren wir die wichtigsten Zusammenhänge, Grundlagen und Funktionsprinzipien.

Im ersten Teil unserer Serie zu Machine Learning mit Python haben wir uns die Grundlagen zum Erstellen eines Jupyter-Notebooks näher angesehen. Mit dem im ersten Abschnitt besprochenen Grundlagen wollen wir uns nun näher mit dem AWS-Service SageMaker befassen.

Für unsere ersten Experimente verwenden wir das MNIST-Dataset als Trainingsdaten. Bei der MNIST-Datenbank (Modified National Institute of Standards and Technology) handelt es sich um eine sehr große Datenbank handgeschriebener Ziffern, die üblicherweise zum Trainieren verschiedener Bildverarbeitungssysteme verwendet wird.

Die Datenbank wird auch häufig für Schulungen und Tests im Bereich des maschinellen Lernens (ML) verwendet. Erstellt wurde das Dataset durch „erneutes Mischen“ der Proben aus den ursprünglichen Datensätzen des NIST-Datasets.

Der Grund dafür ist, dass die Macher der Ansicht waren, dass der NIST-Trainingsdatensatz direkt nicht für Experimente mit maschinellem Lernen geeignet ist, weil er von Mitarbeitern des American Census Bureau und der Testdatensatz von amerikanischen Schülern stammt. In der MNIST-Datenbank wurden die Schwarzweißbilder des NIST auf eine Größe von 28 x 28 Pixeln mit Anti-Aliasing und Graustufenwerte normalisiert.

Die MNIST-Datenbank handschriftlicher Ziffern umfasst aktuell einen Trainingssatz von 50.000 Beispielen sowie einen Testsatz von 10.000 Beispielen, also eine Teilmenge des NIST-Datasets. Der MNIST-Datenfundus eignet sich damit gut, um Lerntechniken und Mustererkennungsmethoden mit nur minimalem Aufwand für Vorverarbeitung und Formatierung an reale Daten auszuprobieren.

Trainingsdaten

Wir laden also im Folgenden das MNIST-Dataset auf unsere Jupyter-Notebook-Instanz herunter, überprüfen die Daten, wandeln sie um und laden sie anschließend in unser S3-Bucket hoch. Das Umwandeln der Daten geschieht mit der numpy-Bibliothek für Python, indem wir das Format von numpy.array in durch Komma getrennte Werte (CSV) ändern.

Der zum Bewerten des Trainingsfortschritts verwendete XGBoost-Algorithmus erwartet eine Eingabe im CSV- oder LIBSVM- Format, wobei letztere eine Open-Source-Bibliothek für maschinelles Lernen ist.

Wir benutzen im Folgenden aber das einfacher anwendbare CSV-Format. Beginnen wir also mit dem Herunterladen des Datasets. AWS stellt dazu folgenden Beispielcode zur Verfügung.

%%time
import pickle, gzip, urllib.request, json
import numpy as np

# Load the dataset
urllib.request.urlretrieve("http://deeplearning.net/data/mnist/mnist.pkl.gz", "mnist.pkl.gz")
with gzip.open('mnist.pkl.gz', 'rb') as f:
    train_set, valid_set, test_set = pickle.load(f, encoding='latin1')
    print(train_set[0].shape)

Die ML-Trainingsdaten wollen zunächst einmal in die Jupyter-Notebook-Instanz geladen werden.
Die ML-Trainingsdaten wollen zunächst einmal in die Jupyter-Notebook-Instanz geladen werden. (Bild: Drilling / Jupyter)

Der Code importiert u.a. zunächst die numpy-Bibliothek unter der Kurzbezeichnung „np“, eine typische Konvention unter Python-Programmierern. Dann lädt er das MNIST-Dataset (mnist.pkl.gz) als gepacktes Archiv von der MNIST-Datenbank-Website auf das Notebook herunter, entpackt die Datei und liest die Datasets „trains_set“, „valid_set“ und „test_set“ in den Arbeitsspeicher des Notebooks ein.

Das „train_set“ enthält Bilder mit handschriftlichen Zahlen zum Trainieren eines Modells. Das „valid_set“ verwendet die Bilder um mit Hilfe des o. e. XGBoost-Algorithmus den Trainingsfortschritt des Modells zu bewerten. Das „test_set“ wird später benutzt, um „Inferenzen“ zum Testen des bereitgestellten Modells abzurufen. In der Praxis würde man nun die Schulungsdaten analysieren, um festzustellen, welche Art Bereinigungen und Transformationen notwendig sind, um die Modell-Training noch zu verbessern.

Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell.
Mithilfe von Bildern, die handschriftlich niedergeschriebene Zahlen umfassen, trainieren wir das Machine-Learning-Modell. (Bild: Drilling / Jupyter)

Das vorbereitete MNIST-Dataset muss allerdings nicht weiter bereinigt werden, da es für eben solche Zwecke entworfen wurde. Trotzdem könnten wir nun beispielsweise die ersten fünf Bilder des „train_set“ wie folgt anzeigen lassen, wozu wir z. B. in Python das Modul „pyplot“ aus der Bibliothek „matplotlib“ verwenden und „train_set“ aus den beiden Strukturen „train_set[0]“ für die eigentlichen Bilder und „train_set[1]“ für die Labels/ Bezeichnungen besteht.

Wie oben erwähnt, verwenden wir für das Transformieren des Trainings-Datasets und das Hochladen auf S3 den XGBoost-Algorithmus. Dieser erwartet für die Trainings-Eingabe Komma separierte Werte (CSV). Das Format der Trainings-Datasets ist numpy.array. Folgender Code wandelt das Dataset aus dem numpy.array-Format in ein CSV-Format um und lädt es auf das oben erzeugte S3-Bucket hoch.

%%time
import struct
import io
import csv
import boto3

def convert_data():
    data_partitions = [('train', train_set), ('validation', valid_set), ('test', test_set)]
    for data_partition_name, data_partition in data_partitions:
        print('{}: {} {}'.format(data_partition_name, data_partition[0].shape, data_partition[1].shape))
    labels = [t.tolist() for t in data_partition[1]]
    features = [t.tolist() for t in data_partition[0]]
    if data_partition_name != 'test':
        examples = np.insert(features, 0, labels, axis=1)
else:
    examples = features

    #print(examples[50000,:])
    np.savetxt('data.csv', examples, delimiter=',')
    key = "{}/{}/examples".format(prefix,data_partition_name)
    url = 's3n://{}/{}'.format(bucket, key)
    boto3.Session().resource('s3').Bucket(bucket).Object(key).upload_file('data.csv')
    print('Done writing to {}'.format(url))
convert_data()

Die Trainings- und Testdaten wurden ins Amazon-S3-Bucket hochgeladen.
Die Trainings- und Testdaten wurden ins Amazon-S3-Bucket hochgeladen. (Bild: Drilling / Jupyter)

Bei Erfolg sollte der Ausgabe zu entnehmen sein, dass 50.000 Trainings-Datensätze, 10.000 Validierungs-Datensätze und 10.000 Test-Datensätze mit einer Größe von jeweils 784 (28x28 Pixel) oder „Neuronen“ (das neuromale Netz interpretiert die 784 Helligkeitswerte des Bildes als „Eingänge“ für den Input-Layer) erfolgreich auf das angegebene S3-Bucket hochgeladen wurden.

Trainieren eines Modells

Für das Trainieren, Bereitstellen und Validieren eines Modells in Amazon SageMaker können Nutzer wahlweise das Amazon SageMaker-Python-SDK oder das AWS SDK für Python (Boto3) benutzen. Optional klappt das natürlich auch direkt an der Python-Konsole, wir verwenden aber der Einfachheit halber wieder eine Notebook-Instance und eines der genannten SDKs.

Für den Anfang ist das Verwenden des SageMaker-Python-SDK von Amazon besser verständlich, da es eine Reihe von Implementierungsdetails abstrahiert und einfacher zu verwenden ist. Ob ein neuronales Netz überhaupt in der Lage ist, Vorhersagen zu machen und von welcher Güte diese sind, hängt von Trainieren des Modells mit geeigneten Trainingsdaten und Machine-Learning-Algorithmus ab.

Jeder ML-Algorithmus erstellt anhand von Beispieldaten eine allgemeine Lösung, die auch als „Modell“ bezeichnet wird. Diese muss möglichst gut zur zu beantwortenden Frage passen. Hat der Entwickler mithilfe von Beispieldaten ein Modell entwickelt, kann er dieses benutzen, um die gleiche Frage mit einem anderen (quasi „neuen“) Satz von Daten zu beantworten. Dieser Vorgang wird auch als Abrufen von Inferenzen (Schlussfolgern) bezeichnet.

Amazon SageMaker bringt bereits zahlreiche MachineLearning-Algorithmen, die man allgemeine für eine große Zahl von typischen Problemarten benutzen kann, wie z. B. Bildklassifikation, DeepAR-Prognosen, Factorization Machines, semantische Segmentierung oder den erwähnten XGBoost-Algorithmus

Allgemein lässt sich aber sagen, dass man das mittels eines Modells zu lösende Problem gut verstehen muss, denn das „Format“ Antwort wirkt sich auf den verwendeten Algorithmus aus. Möchte man etwa eine Mailing-Kampagne zur Gewinnung neuer Kunden mit Hilfe eines neuronalen Netzes steuern, muss man sich überlegen, welche Art von Antwort man anstrebt.

Denkbar sind z. B. Antworten, die in eine diskrete Kategorie passen wie „Hat der Kunde schon früher auf Marketing-Kampagnen geantwortet“ oder „Zu welchen Kundensegment gehört der Kunde“. Ein Algorithmus der sich gut für die diskrete Klassifikation eignet wäre dann entweder der erwähne XGBoost-Algorithmus oder der Algorithmus für lineares Lernen.

Im ersten Fall würde man z. B. für den XGBoost-Algorithmus den „objective“-Parameter auf „logistic“ setzen. Es sind aber auch quantitative Antworten denkbar wie „Was ist der zu erwartende ROI dieses Kunden in Bezug auf den ROI aus dem letzten Mailing. Hierzu könnte man ebenfalls den XGBoost-Algorithmus, allerdings mit dem objective-Parameter „linear“ verwenden.

Machine Learning mit Python: Einführung in SageMaker und Jupyter

Machine Learning mit Python: Einführung in SageMaker und Jupyter

12.11.19 - Amazon SageMaker ist ein von AWS vollständig verwalteter Service, der den gesamten Workflow von Machine Learning abdeckt. In dieser Beitragsreihe befassen wir uns mit der grundlegenden ML-Thematik und dem Erstellen von Jupyter-Notebooks unter SageMaker. lesen

Im nächsten Teil dieses Workshops befassen wir uns konkret mit dem Trainieren, Bereitstellen und Validieren eines Modells mit Hilfe von Amazon SageMaker.

Dieser Beitrag stammt von unserem Partnerportal Dev-Insider.de.

Embedded Machine Learning: ML-Algorithmus statt klassischer Firmware

Embedded Machine Learning: ML-Algorithmus statt klassischer Firmware

21.11.19 - Per maschinellem Lernen (ML) lassen sich viele Embedded Systeme auch ohne spezielle Firmware-Entwicklung entwickeln und austesten. Besonders Anwendungen, in denen ein bestimmter Zusammenhang zwischen den Eingangs- und Ausgangsdaten anhand wissensbasierter Regeln in einer Hochsprache codiert wurde, eigenen sich hervorragend für den ML-Einsatz. lesen

Embedded Software Trends 2019: C++, Python, Machine Learning und vieles mehr

Embedded Software Trends 2019: C++, Python, Machine Learning und vieles mehr

28.11.19 - Drei Keynotes, knapp 100 Vorträge und 17 praxisnahe Kompakt-Seminare: Wer für die aktuellen wie kommenden Herausforderungen an die Software-Entwicklung gerüstet sein will, sollte den ESE Kongress 2019 auf keinen Fall verpassen. lesen

Open-Source-Bibliothek PyTorch 1.2 verfügbar

Open-Source-Bibliothek PyTorch 1.2 verfügbar

29.08.19 - Das Machine Learning-Framework PyTorch 1.2 erhält neue Funktionen und wird verbessert. Das Projekt wurde ursprünglich von der KI-Abteilung von Facebook ins Leben gerufen. lesen

Kommentar zu diesem Artikel abgeben

Schreiben Sie uns hier Ihre Meinung ...
(nicht registrierter User)

Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
Kommentar abschicken
copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 46244882 / Embedded Programmiersprachen)