So verwenden Sie TensorFlow in Ihrem Browser

Während Sie mit TensorFlow einfache neuronale Netze mit relativ kleinen Mengen an Trainingsdaten trainieren können, müssen Sie für tiefe neuronale Netze mit großen Trainingsdatensätzen wirklich CUDA-fähige Nvidia-GPUs oder Google TPUs oder FPGAs zur Beschleunigung verwenden. Die Alternative bestand bis vor kurzem darin, wochenlang auf CPU-Clustern zu trainieren.

Eine der mit TensorFlow 2.0 eingeführten Innovationen ist die JavaScript-Implementierung TensorFlow.js. Ich hätte nicht erwartet, dass dies die Trainings- oder Inferenzgeschwindigkeit verbessert, aber angesichts der Unterstützung aller GPUs (nicht nur CUDA-fähiger GPUs) über die WebGL-API.

[Ebenfalls am: TensorFlow 2.0-Test: Einfacheres maschinelles Lernen]

Was ist TensorFlow.js?

TensorFlow.js ist eine Bibliothek zum Entwickeln und Trainieren von Modellen für maschinelles Lernen in JavaScript und zum Bereitstellen dieser Modelle in einem Browser oder auf Node.js. Sie können vorhandene Modelle verwenden, Python TensorFlow-Modelle konvertieren, mithilfe von Transfer Learning vorhandene Modelle mit Ihren eigenen Daten neu trainieren und Modelle von Grund auf neu entwickeln.

TensorFlow.js Backends

TensorFlow.js unterstützt mehrere Backends für die Ausführung, obwohl jeweils nur eines aktiv sein kann. Die Umgebung von TensorFlow.js Node.js unterstützt die Verwendung eines installierten Builds von Python / C TensorFlow als Back-End, das wiederum die verfügbare Hardwarebeschleunigung des Computers verwenden kann, z. B. CUDA. Es gibt auch ein JavaScript-basiertes Backend für Node.js, aber seine Funktionen sind begrenzt.

Im Browser verfügt TensorFlow.js über mehrere Backends mit unterschiedlichen Eigenschaften. Das WebGL-Backend bietet GPU-Unterstützung unter Verwendung von WebGL-Texturen für die Speicherung und WebGL-Shadern für die Ausführung und kann bis zu 100-mal schneller sein als das einfache CPU-Backend. WebGL benötigt keine CUDA, kann also die vorhandene GPU nutzen.

Das Backend von WebAssembly (WASM) TensorFlow.js für den Browser verwendet die XNNPACK-Bibliothek zur optimierten CPU-Implementierung neuronaler Netzwerkbetreiber. Das WASM-Backend ist im Allgemeinen viel schneller (10x bis 30x) als das JavaScript-CPU-Backend, aber normalerweise langsamer als das WebGL-Backend, mit Ausnahme sehr kleiner Modelle. Ihr Kilometerstand kann variieren. Testen Sie daher sowohl das WASM- als auch das WebGL-Backend für Ihre eigenen Modelle auf Ihrer eigenen Hardware.

TensorFlow.js Modelle und Ebenen

TensorFlow.js unterstützt zwei APIs zum Erstellen neuronaler Netzwerkmodelle. Eine ist die Layer-API, die im Wesentlichen mit der Keras-API in TensorFlow 2 identisch ist. Die andere ist die Core-API, bei der es sich im Wesentlichen um eine direkte Manipulation von Tensoren handelt.

Wie Keras bietet die Layer-API von TensorFlow.js zwei Möglichkeiten, ein Modell zu erstellen: sequentiell und funktional. Die sequentielle API ist ein linearer Stapel von Ebenen, der mit einer Ebenenliste (wie unten gezeigt) oder mit der folgenden model.add()Methode implementiert wird:

const model = tf.sequential ({

 Schichten: [

   tf.layers.dense ({inputShape: [784], Einheiten: 32, Aktivierung: 'relu'}),

   tf.layers.dense ({Einheiten: 10, Aktivierung: 'softmax'}),

 ]]

});

Die funktionale API verwendet die tf.model()API und kann beliebige DAG-Netzwerke (Directed Acyclic Graph) erstellen:

// Erstellen Sie ein beliebiges Diagramm von Ebenen, indem Sie sie verbinden

// über die Methode apply ().

const input = tf.input ({shape: [784]});

const dens1 = tf.layers.dense ({Einheiten: 32, Aktivierung: 'relu'}). apply (Eingabe);

const dens2 = tf.layers.dense ({Einheiten: 10, Aktivierung: 'softmax'}). apply (dens1);

const model = tf.model ({Eingaben: Eingabe, Ausgaben: dicht2});

Die Core-API kann dieselben Ziele mit unterschiedlichem Code erreichen und ist weniger intuitiv an Ebenen gebunden. Das folgende Modell mag wie grundlegende Tensoroperationen aussehen, erzeugt jedoch dasselbe Netzwerk wie die beiden vorherigen Formulierungen. Beachten Sie die Verwendung von relu()und softmax(), die beide neuronale Netzwerkoperationen sind, in der folgenden model()Funktion.

// Die Gewichte und Vorspannungen für die beiden dichten Schichten.

const w1 = tf.variable (tf.randomNormal ([784, 32]));

const b1 = tf.variable (tf.randomNormal ([32]));

const w2 = tf.variable (tf.randomNormal ([32, 10]));

const b2 = tf.variable (tf.randomNormal ([10]));

Funktionsmodell (x) {

  return x.matMul (w1) .add (b1) .relu (). matMul (w2) .add (b2) .softmax ();

}}

Vorgefertigte TensorFlow.js-Modelle

Es sind über ein Dutzend vorgefertigte TensorFlow.js-Modelle dokumentiert, im Repository verfügbar und werden auf NPM (zur Verwendung in Node.js) und unpkg (zur Verwendung in einem Browser) gehostet. Sie können diese Modelle wie geliefert oder zum Transferlernen verwenden. Mit ein wenig Arbeit können Sie sie auch als Bausteine ​​für andere Modelle verwenden.

Einige dieser Modelle verwenden die Kamera eines Geräts in Echtzeit, z. B. Handpose:

Die folgende Liste ist ein praktischer Index für die meisten vorgefertigten TensorFlow.js-Modelle.

  • Bildklassifizierung
  • Objekterkennung
  • Körpersegmentierung
  • Posenschätzung
  • Erkennung der Texttoxizität
  • Universeller Satzcodierer
  • Sprachbefehlserkennung
  • KNN-Klassifikator
  • Einfache Gesichtserkennung
  • Semantische Segmentierung
  • Gesichtsmarkierungserkennung
  • Handposenerkennung
  • Beantwortung von Fragen in natürlicher Sprache

Was ist ml5.js?

ml5.js ist eine Open-Source-Schnittstelle zu TensorFlow.js, die hauptsächlich an der NYU entwickelt wurde. ml5.js bietet im Browser sofortigen Zugriff auf vorab trainierte Modelle zum Erkennen menschlicher Posen, zum Generieren von Text, zum Stylen eines Bildes mit einem anderen, zum Komponieren von Musik, zur Tonhöhenerkennung, zu gemeinsamen englischsprachigen Wortbeziehungen und vielem mehr. Während sich TensorFlow.js in erster Linie an Datenwissenschaftler und -entwickler richtet, zielt ml5.js darauf ab, ein breiteres Verständnis der Öffentlichkeit für maschinelles Lernen zu fördern und eine tiefere Auseinandersetzung mit ethischem Rechnen, verantwortungsbewusster Datenerfassung sowie Zugänglichkeit und Vielfalt von Menschen und Perspektiven in Technologie und Kunst zu fördern .

Die meisten Beispiele in ml5.js hängen von den Modellen von TensorFlow.js ab. Sie wurden als Webseiten verpackt, die Sie unverändert ausführen oder bearbeiten können, um beispielsweise verschiedene Bilder zu verwenden.

Demo: Iris-Klassifizierung mit TensorFlow.js

Der berühmte Iris-Diskriminierungsdatensatz, der 1936 von RA Fisher zur Veranschaulichung der linearen Diskriminanzanalyse erstellt wurde, wird immer noch als Testfall für statistische und maschinelle Lernklassifizierungsmethoden verwendet. Es werden vier Merkmale verwendet, die Länge und Breite der Blütensepale und Blütenblätter, um drei Arten von Iris mit 50 Proben jeder Art zu klassifizieren. (Fischers Originalarbeit wurde in den Annals of Eugenics veröffentlicht , die mehr über die Wissenschaft im Jahr 1936 aussagen als über die Daten oder Statistiken.)

Wenn Sie eine Clusteranalyse für diese Daten durchführen, teilen sich zwei der Arten einen Cluster, der dritte (I. Setosa) in einem separaten Cluster. Andererseits kann die Hauptkomponentenanalyse alle drei Arten ziemlich gut trennen.

Das Beispiel von TensorFlow.js passt die Iris-Daten mit zwei vollständig verbundenen (dichten) neuronalen Netzwerkschichten an, wie im folgenden Codeextrakt gezeigt.

// Definiere die Topologie des Modells: zwei dichte Schichten.

const model = tf.sequential ();

model.add (tf.layers.dense (

{Einheiten: 10, Aktivierung: 'sigmoid', inputShape: [xTrain.shape [1]]}

));

model.add (tf.layers.dense ({Einheiten: 3, Aktivierung: 'softmax'}));

model.summary ();

const optimizer = tf.train.adam (params.learningRate);

model.compile ({

Optimierer: Optimierer,

Verlust: 'kategorische Kreuzentropie',

Metriken: ['Genauigkeit'],

});

Wie Sie im folgenden Screenshot sehen können, kann dieses Modell die drei Arten ordentlich klassifizieren. Wenn Sie jedoch mit den Parametern herumspielen, werden Sie feststellen, dass einige Verwirrungen zwischen zwei Arten (die im selben Cluster) wieder auftreten, wenn Sie mehr als 40 Epochen durchlaufen.

Konvertieren von Python TensorFlow-Modellen in JavaScript

Ein Teil des Repositorys TensorFlow.js enthält einen Konverter für gespeicherte TensorFlow- und Keras-Modelle. Es werden drei Formate unterstützt: SavedModel (Standard für TensorFlow), HDF5 (Standard für Keras) und TensorFlow Hub. Sie können den Konverter für gespeicherte Modelle aus den Standard-Repositorys, Modelle, die Sie selbst trainiert haben, und Modelle verwenden, die Sie an anderer Stelle gefunden haben.

Die Konvertierung besteht aus zwei Schritten. Der erste Schritt besteht darin, das vorhandene Modell in model.json- und binäre Gewichtungsdateien zu konvertieren. Der zweite Schritt besteht darin, eine API zum Laden des Modells in TensorFlow.js zu verwenden, entweder tf.loadGraphModelfür konvertierte TensorFlow- und TensorFlow Hub-Modelle oder tf.loadLayersModelfür konvertierte Keras-Modelle.

Transferlernen verwenden

TensorFlow.js unterstützt das Transferlernen im Wesentlichen auf die gleiche Weise wie TensorFlow. Die Dokumentation enthält Beispiele zum Anpassen von MobileNet für Ihre eigenen Bilder und zum Anpassen eines Modells für die Sprachbefehlserkennung für Ihre eigenen Klangklassen. Im Wesentlichen fügen Sie in jedem dieser Codelabs einen kleinen benutzerdefinierten Klassifikator über dem trainierten Modell hinzu und trainieren diesen.

Insgesamt kann TensorFlow.js fast alles, was TensorFlow kann. Angesichts der Tatsache, dass die Zielumgebungen für TensorFlow.js (GPUs mit Gartenvielfalt für Spiele) in der Regel weniger GPU-Speicher aufweisen als die großen Nvidia-Server-GPUs, die normalerweise für TensorFlow-Deep-Learning-Schulungen verwendet werden, müssen Sie möglicherweise die Größe Ihrer GPUs reduzieren Modell, damit es in einem Browser ausgeführt wird. Das Konvertierungsprogramm erledigt einige dieser Aufgaben für Sie. Möglicherweise müssen Sie jedoch Ebenen manuell entfernen und die Stapelgrößen für Ihr Training reduzieren.