TL; DR
MNIST è il riconoscimento delle immagini Hello World. Dopo averlo appreso a memoria, queste domande nella tua mente sono facili da risolvere.
Impostazione della domanda:
La tua domanda principale scritta è
// how to train, where to pass image and labels ?
all'interno del tuo blocco di codice. Per quelli ho trovato la risposta perfetta dagli esempi della sezione degli esempi di Tensorflow.js: esempio MNIST. I miei link sottostanti hanno versioni javascript e node.js pure e spiegazione di Wikipedia. Li esaminerò al livello necessario per rispondere alla domanda principale nella tua mente e aggiungerò anche prospettive su come le tue immagini e le tue etichette hanno qualcosa a che fare con il set di immagini MNIST e gli esempi che la utilizzano.
Cominciando dall'inizio:
Frammenti di codice.
dove passare le immagini (esempio Node.js)
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;
}
Appunti:
Il set di dati MNIST è un'immagine enorme, in cui in un file ci sono diverse immagini come tessere in puzzle, ognuna con le stesse dimensioni, fianco a fianco, come caselle nella tabella di coordinamento xey. Ogni casella ha un campione e la corrispondente xey nell'array di etichette ha l'etichetta. Da questo esempio, non è un grosso problema trasformarlo in diversi formati di file, in modo che in realtà venga fornita solo una foto alla volta al ciclo while da gestire.
etichette:
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;
}
Appunti:
Qui, le etichette sono anche dati di byte in un file. Nel mondo Javascript, e con l'approccio che hai nel tuo punto di partenza, le etichette potrebbero anche essere un array json.
addestrare il modello:
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
});
Appunti:
Qui model.fit
l'attuale riga di codice che fa la cosa: addestra il modello.
Risultati di tutto:
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)}`);
Nota:
In Data Science, anche questa volta, la parte più faschinante è sapere quanto il modello sopravvive al test di nuovi dati e senza etichette, può etichettarli o no? Per questo è la parte di valutazione che ora ci stampa alcuni numeri.
Perdita e precisione: [4]
Minore è la perdita, migliore è un modello (a meno che il modello non si sia adattato eccessivamente ai dati di allenamento). La perdita viene calcolata sull'addestramento e sulla validazione e la sua interperazione è quanto bene stia andando il modello per questi due set. A differenza della precisione, la perdita non è una percentuale. È una sintesi degli errori commessi per ciascun esempio nei set di addestramento o di validazione.
..
L'accuratezza di un modello è di solito determinata dopo che i parametri del modello sono stati appresi e fissati e non è in corso alcun apprendimento. Quindi i campioni di prova vengono inviati al modello e vengono registrati il numero di errori (zero-one loss) che il modello commette, dopo il confronto con gli obiettivi reali.
Maggiori informazioni:
Nelle pagine di github, nel file README.md, c'è un collegamento al tutorial, dove tutto nell'esempio di github è spiegato in maggior dettaglio.
[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] Come interpretare "perdita" e "accuratezza" per un modello di apprendimento automatico