TL; DR
MNIST - це розпізнавання зображень Hello World. Вивчивши його напам’ять, ці питання у вашій думці легко вирішити.
Постановка питань:
Ваше головне запитання - це
// how to train, where to pass image and labels ?
всередині блоку коду. Для тих, хто знайшов ідеальну відповідь на прикладах розділу прикладів Tensorflow.js: Приклад MNIST. У моїх нижче посиланнях є чисті версії JavaScript та node.js та пояснення у Вікіпедії. Я розберу їх на рівні, необхідному, щоб відповісти на головне запитання у вашій думці, і додам також перспективи того, як ваші власні зображення та мітки мають відношення до набору зображень MNIST та прикладів його використання.
Насамперед:
Кодові фрагменти
куди передавати зображення (зразок 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;
}
Примітки:
Набір даних MNIST - це величезне зображення, де в одному файлі є кілька зображень, як плитки в головоломці, кожне з однаковим розміром, поруч, як вікна в координаційній таблиці x і y. Кожне поле має один зразок і відповідні х і у в масиві міток мають мітку. З цього прикладу не дуже важливо повернути його до декількох форматів файлів, так що фактично лише один малюнок одночасно надається циклу while для обробки.
Мітки:
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;
}
Примітки:
Тут мітки також є байтовими даними у файлі. У світі Javascript і підході, який ви маєте на початковому етапі, мітки також можуть бути масивом json.
навчіть модель:
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
});
Примітки:
Ось model.fit
фактичний рядок коду, який робить це: тренує модель.
Результати всієї справи:
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)}`);
Примітка:
У Data Science, також цього разу, найбільш захоплююча частина полягає в тому, щоб знати, наскільки добре модель пережила тест нових даних і жодних міток, може їх маркувати чи ні? Тому що це частина оцінки, яка тепер друкує нам деякі цифри.
Втрата і точність: [4]
Чим менші втрати, тим краща модель (якщо тільки модель не надто підходила до даних тренувань). Втрати обчислюються при навчанні та валідації, і його взаємодія полягає в тому, наскільки добре працює модель для цих двох наборів. На відміну від точності, втрати не є відсотком. Це підсумок помилок, зроблених для кожного прикладу в навчальних наборах чи валідаціях.
..
Точність моделі зазвичай визначається після того, як параметри моделі вивчаються та фіксуються і не відбувається навчання. Потім тестові зразки подаються до моделі і записується кількість помилок (нуль-одна втрата), яку робить модель, після порівняння з справжніми цілями.
Більше інформації:
На сторінках github, у файлі README.md, є посилання на підручник, де все у прикладі github пояснено більш докладно.
[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] Як інтерпретувати "втрату" та "точність" для моделі машинного навчання