简述
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++) {
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] 如何解释机器学习模型的“损失”和“准确性”
fit
方法,或者在数据集中传递给fitDataset
,如示例所示。 - jdehesaxs
就是我的图像数据,而ys
则是标签? - Alex