TL;DR
MNIST 是图像识别 Hello World。熟记下来,你心中的这些问题就迎刃而解了。
问题设置:
你写的主要问题是
// how to train, where to pass image and labels ?
在您的代码块内。对于那些我从 Tensorflow.js 示例部分的示例中找到完美答案的人:MNIST 示例。我的以下链接有纯 javascript 和 node.js 版本以及 Wikipedia 解释。我将在必要的层面上对它们进行回答,以回答您心中的主要问题,我还将添加您自己的图像和标签如何与 MNIST 图像集以及使用它的示例有关的观点。
第一件事:
代码 sn-ps。
在哪里传递图像(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)}`);
注意:
在数据科学中,这一次也是如此,最令人着迷的部分是知道模型在新数据和没有标签的测试中的生存能力如何,它可以给它们加标签吗?因为那是评估部分,现在我们会打印一些数字。
损失和准确性:[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]How to interpret "loss" and "accuracy" for a machine learning model