いささかテクニカルではありますが、ラベルデータのtrain-labels.idx1-ubyteも同様の方法で開き、中身を得ることができます。「THE MNIST DATABASE of handwritten digits」ページに掲出されているtrain-labels.idx1-ubyteの次の表は、
次のような図で表すことができます。
ラベルデータの読み取りと中身の取得は、次のコードで行えます。
inputFile.addEventListener('change', (e) => {
// 取得したファイル
const files = e.target.files;
console.log(files[0].name); // ファイル名
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => {
resolve(e.target.result);
}
reader.readAsArrayBuffer(files[0]);
}).then((buffer) => {
console.log(buffer); // ArrayBuffer(60008)
const dataView = new DataView(buffer);
// マジックナンバー
const magicNum = dataView.getInt32(0);
console.log(magicNum); // 2049
// 含まれるラベルの数
const itemNum = dataView.getInt32(4);
console.log(itemNum); // 60000
// 最初のラベルを出力してみる
const label1 = dataView.getUint8(8);
console.log(label1); // 5
// 60,000個のラベル値を入れる配列
const labelArray = [];
for (let i = 0; i < itemNum; i++) {
labelArray.push(dataView.getUint8(8 + i));
}
console.log(labelArray);
});
}, false);
下図は出力の例です。
上記コードでは、最初のラベルを出力しており、その結果は5です。これはtrain-images.idx3-ubyteに含まれる、最初の画像データが5に見える結果と対応しています。