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
// how to train, where to pass image and labels ?
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)
async function loadImages(filename) {
const buffer = await fetchOnceAndSaveToDiskWithBuffer(filename);
const headerBytes = IMAGE_HEADER_BYTES;
const recordBytes = IMAGE_HEIGHT * IMAGE_WIDTH;
const headerValues = loadHeaderValues(buffer, headerBytes);
assert.equal(headerValues[0], IMAGE_HEADER_MAGIC_NUM);
assert.equal(headerValues[2], IMAGE_HEIGHT);
assert.equal(headerValues[3], IMAGE_WIDTH);
const images = [];
let index = headerBytes;
while (index < buffer.byteLength) {
const array = new Float32Array(recordBytes);
for (let i = 0; i < recordBytes; i++) {
// Normalize the pixel values into the 0-1 interval, from
// the original 0-255 interval.
array[i] = buffer.readUInt8(index++) / 255;
}
images.push(array);
}
assert.equal(images.length, headerValues[1]);
return images;
}
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:
async function loadLabels(filename) {
const buffer = await fetchOnceAndSaveToDiskWithBuffer(filename);
const headerBytes = LABEL_HEADER_BYTES;
const recordBytes = LABEL_RECORD_BYTE;
const headerValues = loadHeaderValues(buffer, headerBytes);
assert.equal(headerValues[0], LABEL_HEADER_MAGIC_NUM);
const labels = [];
let index = headerBytes;
while (index < buffer.byteLength) {
const array = new Int32Array(recordBytes);
for (let i = 0; i < recordBytes; i++) {
array[i] = buffer.readUInt8(index++);
}
labels.push(array);
}
assert.equal(labels.length, headerValues[1]);
return labels;
}
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:
await data.loadData();
const {images: trainImages, labels: trainLabels} = data.getTrainData();
model.summary();
let epochBeginTime;
let millisPerStep;
const validationSplit = 0.15;
const numTrainExamplesPerEpoch =
trainImages.shape[0] * (1 - validationSplit);
const numTrainBatchesPerEpoch =
Math.ceil(numTrainExamplesPerEpoch / batchSize);
await model.fit(trainImages, trainLabels, {
epochs,
batchSize,
validationSplit
});
Anmerkungen:
Hier model.fit
ist die eigentliche Codezeile, die das Ding macht: trainiert das Modell.
Ergebnisse der ganzen Sache:
const {images: testImages, labels: testLabels} = data.getTestData();
const evalOutput = model.evaluate(testImages, testLabels);
console.log(
`\nEvaluation result:\n` +
` Loss = ${evalOutput[0].dataSync()[0].toFixed(3)}; `+
`Accuracy = ${evalOutput[1].dataSync()[0].toFixed(3)}`);
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]
Je geringer der Verlust, desto besser ein Modell (es sei denn, das Modell hat sich zu stark an die Trainingsdaten angepasst). Der Verlust wird anhand von Training und Validierung berechnet, und seine Interferenz gibt an, wie gut das Modell für diese beiden Sätze abschneidet. Im Gegensatz zur Genauigkeit ist der Verlust kein Prozentsatz. Es ist eine Zusammenfassung der Fehler, die für jedes Beispiel in Trainings- oder Validierungssätzen gemacht wurden.
..
Die Genauigkeit eines Modells wird normalerweise bestimmt, nachdem die Modellparameter gelernt und festgelegt wurden und kein Lernen stattfindet. Dann werden die Testproben dem Modell zugeführt und die Anzahl der Fehler (Null-Eins-Verlust), die das Modell macht, wird nach dem Vergleich mit den wahren Zielen aufgezeichnet.
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