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データセットは巨大な画像で、1つのファイルにパズルのタイルのようないくつかの画像があり、xとyの調整テーブルのボックスのように、それぞれが同じサイズで並んでいます。各ボックスには1つのサンプルがあり、labels配列の対応するxとyにはラベルがあります。この例から、それを複数のファイル形式に変換することは大したことではないので、実際には、whileループに一度に1つのpicのみが渡されて処理されます。
ラベル:
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]
損失が少ないほど、モデルは優れています(モデルがトレーニングデータに適合していなければ)。損失はトレーニングと検証で計算され、その相互作用は、モデルがこれら2つのセットに対してどの程度適切に機能しているかを示します。精度とは異なり、損失はパーセンテージではありません。これは、トレーニングセットまたは検証セットの各例で発生したエラーの合計です。
..
モデルの精度は通常、モデルのパラメーターが学習および修正され、学習が行われなくなった後で決定されます。次に、テストサンプルがモデルに送られ、真のターゲットと比較した後、モデルで発生したミス(ゼロワンロス)の数が記録されます。
詳しくは:
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] 機械学習モデルの「損失」と「正確さ」を解釈する方法