TL; DR
MNIST est la reconnaissance d'image Hello World. Après l'avoir appris par cœur, ces questions dans votre esprit sont faciles à résoudre.
Réglage de la question:
Votre principale question écrite est
// how to train, where to pass image and labels ?
à l'intérieur de votre bloc de code. Pour ceux que j'ai trouvé la réponse parfaite à partir d'exemples de la section d'exemples Tensorflow.js: exemple MNIST. Mes liens ci-dessous contiennent des versions javascript et node.js et une explication Wikipedia. Je vais les parcourir au niveau nécessaire pour répondre à la question principale dans votre esprit et j'ajouterai également des perspectives sur la façon dont vos propres images et étiquettes ont quelque chose à voir avec l'ensemble d'images MNIST et les exemples qui l'utilisent.
Tout d'abord:
Extraits de code.
où passer les images (exemple 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;
}
Remarques:
Le jeu de données MNIST est une image énorme, où dans un fichier il y a plusieurs images comme des tuiles dans un puzzle, chacune avec la même taille, côte à côte, comme des boîtes dans la table de coordination x et y. Chaque boîte a un échantillon et x et y correspondants dans le tableau des étiquettes ont l'étiquette. Dans cet exemple, il n'est pas très important de le transformer en plusieurs fichiers, de sorte qu'en fait, une seule image à la fois est donnée à la boucle while à gérer.
Étiquettes:
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;
}
Remarques:
Ici, les étiquettes sont également des données d'octets dans un fichier. Dans le monde Javascript, et avec l'approche que vous avez dans votre point de départ, les étiquettes pourraient également être un tableau json.
former le modèle:
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
});
Remarques:
Voici model.fit
la véritable ligne de code qui fait la chose: entraîne le modèle.
Résultats de l'ensemble:
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)}`);
Remarque:
En Data Science, également cette fois-ci, la partie la plus intéressante est de savoir dans quelle mesure le modèle survit au test de nouvelles données et sans étiquettes, peut-il les étiqueter ou non? Car c'est la partie évaluation qui nous imprime maintenant quelques chiffres.
Perte et précision: [4]
Plus la perte est faible, meilleur est le modèle (à moins que le modèle ne soit trop adapté aux données d'entraînement). La perte est calculée lors de la formation et de la validation et son interaction est la performance du modèle pour ces deux ensembles. Contrairement à la précision, la perte n'est pas un pourcentage. Il s'agit d'une somme des erreurs commises pour chaque exemple dans les ensembles de formation ou de validation.
..
La précision d'un modèle est généralement déterminée après que les paramètres du modèle ont été appris et fixés et qu'aucun apprentissage n'a lieu. Ensuite, les échantillons de test sont introduits dans le modèle et le nombre d'erreurs (perte nulle) que le modèle commet est enregistré, après comparaison avec les vraies cibles.
Plus d'information:
Dans les pages github, dans le fichier README.md, il y a un lien vers le tutoriel, où tout dans l'exemple github est expliqué plus en détail.
[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] Comment interpréter la "perte" et la "précision" pour un modèle d'apprentissage automatique