7-3 MNISTラベルデータを開いて中身を得る

いささかテクニカルではありますが、ラベルデータの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に見える結果と対応しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA