TL; DR
MNIST是图像识别Hello World。认真学习后,这些问题就很容易解决了。
问题设置:
您写的主要问题是
// how to train, where to pass image and labels ?
在您的代码块中。对于那些人,我从Tensorflow.js示例部分的示例(MNIST示例)中找到了完美的答案。我的以下链接提供了纯javascript和node.js版本以及Wikipedia的说明。我将在必要的水平上解答他们,以回答您心中的主要问题,并且还将添加一些观点,说明您自己的图像和标签如何与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://zh.wikipedia.org/wiki/MNIST_database
[4] 如何解释机器学习模型的“损失”和“准确性”