Ich möchte einen Bildklassifizierer erstellen, kenne aber Python nicht. Tensorflow.js arbeitet mit Javascript, mit dem ich vertraut bin. Können Modelle damit trainiert werden und was wären die Schritte dazu? Ehrlich gesagt habe ich keine Ahnung, wo ich anfangen soll.
Das einzige, was ich herausgefunden habe, ist, wie man "mobilet", anscheinend eine Reihe von vorab trainierten Modellen, lädt und Bilder damit klassifiziert:
const tf = require('@tensorflow/tfjs'),
mobilenet = require('@tensorflow-models/mobilenet'),
tfnode = require('@tensorflow/tfjs-node'),
fs = require('fs-extra');
const imageBuffer = await fs.readFile(......),
tfimage = tfnode.node.decodeImage(imageBuffer),
mobilenetModel = await mobilenet.load();
const results = await mobilenetModel.classify(tfimage);
Das funktioniert, aber es nützt mir nichts, weil ich mein eigenes Modell mit meinen Bildern mit von mir erstellten Beschriftungen trainieren möchte.
=======================
Angenommen, ich habe eine Reihe von Bildern und Etiketten. Wie trainiere ich damit ein Modell?
const myData = JSON.parse(await fs.readFile('files.json'));
for(const data of myData){
const image = await fs.readFile(data.imagePath),
labels = data.labels;
// how to train, where to pass image and labels ?
}
fit
Methode oder an das übergebene Dataset übergebenfitDataset
, wie in den Beispielen gezeigt.Antworten:
Zunächst müssen die Bilder in Tensoren konvertiert werden. Der erste Ansatz wäre, einen Tensor zu erstellen, der alle Merkmale enthält (bzw. einen Tensor, der alle Beschriftungen enthält). Dies sollte nur dann der Fall sein, wenn der Datensatz nur wenige Bilder enthält.
Die Beschriftungen wären ein Array, das den Typ jedes Bildes angibt
Man muss jetzt eine Hot-Codierung der Etiketten erstellen
Sobald es die Tensoren gibt, müsste man das Modell für das Training erstellen. Hier ist ein einfaches Modell.
Dann kann das Modell trainiert werden
Wenn das Dataset viele Bilder enthält, müsste stattdessen ein tfDataset erstellt werden. Diese Antwort beschreibt , warum.
Und verwenden Sie
model.fitDataset(ds)
, um das Modell zu trainierenDas Obige ist für das Training in Nodejs. Um eine solche Verarbeitung im Browser durchzuführen,
genFeatureTensor
kann wie folgt geschrieben werden:Ein Wort der Vorsicht ist, dass eine starke Verarbeitung den Hauptthread im Browser blockieren kann. Hier kommen Web-Worker ins Spiel.
quelle
tf.image.resizeBilinear
Betrachten Sie das Beispiel https://codelabs.developers.google.com/codelabs/tfjs-training-classfication/#0
Was sie tun ist:
dann trainieren
Der Aufbau des Datensatzes ist wie folgt:
Das große Bild ist in n vertikale Abschnitte unterteilt. (n ist chunkSize)
Betrachten Sie eine ChunkSize der Größe 2.
Angesichts der Pixelmatrix von Bild 1:
Gegeben ist die Pixelmatrix von Bild 2
Das resultierende Array wäre
1 2 3 4 5 6 7 8 9 1 2 3
(die 1D-Verkettung irgendwie)Im Grunde genommen haben Sie am Ende der Verarbeitung einen großen Puffer, der darstellt
[...Buffer(image1), ...Buffer(image2), ...Buffer(image3)]
Diese Art der Formatierung wird häufig bei Klassifizierungsproblemen durchgeführt. Anstatt mit einer Zahl zu klassifizieren, verwenden sie ein boolesches Array. Um 7 von 10 Klassen vorherzusagen, würden wir in Betracht ziehen
[0,0,0,0,0,0,0,1,0,0] // 1 in 7e position, array 0-indexed
Was Sie tun können, um loszulegen
Unten habe ich eine Unterklasse
MNistData::load
(der Rest kann unverändert gelassen werden (außer in script.js, wo Sie stattdessen Ihre eigene Klasse instanziieren müssen).Ich generiere immer noch 28x28 Bilder, schreibe eine Ziffer darauf und erhalte eine perfekte Genauigkeit, da ich kein Rauschen oder freiwillig falsche Beschriftungen einbeziehe.
quelle
Ich fand ein Tutorial [1], wie man ein vorhandenes Modell verwendet, um neue Klassen zu trainieren. Hauptcodeteile hier:
index.html head:
index.html body:
index.js:
Die Hauptidee besteht darin, das vorhandene Netzwerk zu verwenden, um seine Vorhersage zu treffen, und dann das gefundene Etikett durch Ihr eigenes zu ersetzen.
Der vollständige Code befindet sich im Tutorial. Ein weiteres vielversprechendes, fortgeschritteneres in [2]. Es bedarf einer strengen Vorverarbeitung, also lasse ich es nur hier, ich meine, es ist so viel fortgeschrittener.
Quellen:
[1] https://codelabs.developers.google.com/codelabs/tensorflowjs-teachablemachine-codelab/index.html#6
[2] https://towardsdatascience.com/training-custom-image-classification-model-on-the-browser-with-tensorflow-js-and-angular-f1796ed24934
quelle
TL; DR
MNIST ist die Bilderkennung Hello World. Nachdem Sie es auswendig gelernt haben, sind diese Fragen in Ihrem Kopf leicht zu lösen.
Frageneinstellung:
Ihre Hauptfrage ist geschrieben
in Ihrem Codeblock. Für diejenigen fand ich die perfekte Antwort aus Beispielen von Tensorflow.js Beispielabschnitt: MNIST-Beispiel. Meine unten stehenden Links enthalten reine Javascript- und node.js-Versionen sowie Wikipedia-Erklärungen. Ich werde sie auf der Ebene durchgehen, die zur Beantwortung der Hauptfrage in Ihrem Kopf erforderlich ist, und ich werde auch Perspektiven hinzufügen, wie Ihre eigenen Bilder und Beschriftungen etwas mit dem MNIST-Bildsatz und den Beispielen zu tun haben, die ihn verwenden.
Das wichtigste zuerst:
Code Ausschnitte.
Wo Bilder übergeben werden sollen (Node.js Beispiel)
Anmerkungen:
Der MNIST-Datensatz ist ein riesiges Bild, in dem in einer Datei mehrere Bilder wie Kacheln im Puzzle enthalten sind, die alle dieselbe Größe nebeneinander haben, wie Kästchen in der x- und y-Koordinationstabelle. Jede Box hat eine Probe und das entsprechende x und y im Beschriftungsarray hat die Beschriftung. In diesem Beispiel ist es keine große Sache, das Format auf mehrere Dateien zu ändern, sodass der while-Schleife jeweils nur ein Bild zugewiesen wird.
Etiketten:
Anmerkungen:
Hier sind Beschriftungen auch Byte-Daten in einer Datei. In der Javascript-Welt und mit dem Ansatz, den Sie als Ausgangspunkt haben, können Beschriftungen auch ein JSON-Array sein.
trainiere das Modell:
Anmerkungen:
Hier
model.fit
ist die eigentliche Codezeile, die das Ding macht: trainiert das Modell.Ergebnisse der ganzen Sache:
Hinweis:
In Data Science ist es auch hier am schwierigsten zu wissen, wie gut das Modell den Test neuer Daten und ohne Beschriftungen übersteht. Kann es sie beschriften oder nicht? Denn das ist der Bewertungsteil, der uns jetzt einige Zahlen druckt.
Verlust und Genauigkeit: [4]
..
Mehr Informationen:
Auf den Github-Seiten in der Datei README.md befindet sich ein Link zum Lernprogramm, in dem alle im Github-Beispiel ausführlicher erläutert werden.
[1] https://github.com/tensorflow/tfjs-examples/tree/master/mnist
[2] https://github.com/tensorflow/tfjs-examples/tree/master/mnist-node
[3] https://en.wikipedia.org/wiki/MNIST_database
[4] Interpretation von "Verlust" und "Genauigkeit" für ein Modell des maschinellen Lernens
quelle