MNISTラベル情報を読み込む

MNISTラベル情報をPerlで読み込むサンプルプログラムです。MNISTは、ディープラーニングで利用できる画像のサンプルです。

THE MNIST DATABASE of handwritten digitsを読み込むサンプルです。

use strict;
use warnings;
use FindBin;

# MNISTラベル情報を読み込む
my $mnist_label_file = "$FindBin::Bin/data/train-labels-idx1-ubyte";

open my $mnist_label_fh, '<', $mnist_label_file
  or die "Can't open file $mnist_label_file: $!";

# マジックナンバー
my $label_buffer;
read($mnist_label_fh, $label_buffer, 4);
my $magic_number = unpack('N1', $label_buffer);
if ($magic_number != 0x00000801) {
  die "Invalid magic number expected " . 0x00000801 . "actual $magic_number";
}

# ラベル数
read($mnist_label_fh, $label_buffer, 4);
my $items_count = unpack('N1', $label_buffer);

# ラベルの読み込み
my $label_numbers = [];
for (my $i = 0; $i < $items_count; $i++) {
  read $mnist_label_fh, $label_buffer, 1;
  my $label_number = unpack('C1', $label_buffer);
  push @$label_numbers, $label_number;
}

# ラベル情報
my $label_info = {};
$label_info->{items_count} = $items_count;
$label_info->{label_numbers} = $label_numbers;

MNISTラベル情報を読み込むプログラムの簡易解説

「data」以下に「train-labels-idx1-ubyte」を配置します。

ファイルをオープンしてread関数で読み込んでいきます。

マジックナンバーのチェックを行います。ビッグエンディアンの32bit整数なので、unpackに「N1」を指定します。

ラベル数を取得します。ビッグエンディアンの32bit整数なので、unpackに「N1」を指定します。

ラベルを読み込んでいきます。ラベルの一つの情報は符号なし8bit整数なので「C1」を指定します。

訓練用のラベル情報である「train-labels-idx1-ubyte」を読み込んでいますが、検証用のラベル情報「t10k-labels-idx1-ubyte」も同様の方法で読み込めます。

関連情報