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. Каждый блок имеет один образец, и соответствующие 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] Как интерпретировать «потери» и «точность» для модели машинного обучения