ひきぷろのプログラミング日記

プログラミングの日記です。

(C#) MNISTのラベルデータを読み込むクラス

前回の記事では、 MNIST の画像データを読み込むクラスを作りました。hikipuro.hatenadiary.jp

今回は引き続き、ラベルデータを読み込むクラスを作ってみました。

またコピペしてみます。

MNIST のラベルデータを読み込むクラス
using System.Text;
using System.IO;

namespace NNTest {
	/// <summary>
	/// MNIST のラベルファイルをロードするためのクラス.
	/// http://yann.lecun.com/exdb/mnist/
	/// </summary>
	class MNistLabelLoader {
		/// <summary>
		/// 0x0000 から始まるマジックナンバー.
		/// 0x00000801 (2049) が入る.
		/// </summary>
		public int magicNumber;

		/// <summary>
		/// ラベルの数.
		/// </summary>
		public int numberOfItems;

		/// <summary>
		/// ラベルの配列.
		/// </summary>
		public byte[] labelList;

		/// <summary>
		/// コンストラクタ.
		/// </summary>
		public MNistLabelLoader() {
		}
		
		/// <summary>
		/// MNIST のラベルファイルをロードする.
		/// 失敗した時は null を返す.
		/// </summary>
		/// <param name="path">ラベルファイルのパス.</param>
		/// <returns></returns>
		public static MNistLabelLoader Load(string path) {
			// ファイルが存在しない
			if (File.Exists(path) == false) {
				return null;
			}

			// バイト配列を分解する
			FileStream stream = new FileStream(path, FileMode.Open);
			BinaryReaderBE reader = new BinaryReaderBE(stream);

			MNistLabelLoader loader = new MNistLabelLoader();
			loader.magicNumber = reader.ReadInt32();
			loader.numberOfItems = reader.ReadInt32();
			loader.labelList = reader.ReadBytes(loader.numberOfItems);

			reader.Close();
			return loader;
		}

		/// <summary>
		/// デバッグ用.
		/// </summary>
		/// <returns></returns>
		public override string ToString() {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(GetType().Name);
			stringBuilder.AppendLine();
			stringBuilder.AppendFormat("\tmagicNumber: 0x{0:X8}", magicNumber);
			stringBuilder.AppendLine();
			stringBuilder.AppendFormat("\tnumberOfItems: {0}", numberOfItems);
			return stringBuilder.ToString();
		}
	}
}

BinaryReaderBE については、前回の記事を見てみてください。

使い方
string path = "../../data/t10k-labels.idx1-ubyte";
MNistLabelLoader loader = MNistLabelLoader.Load(path);
Console.WriteLine("loader: {0}", loader.ToString());
Console.WriteLine("Label[0]: {0}", loader.labelList[0]);

ラベルファイルには 7 とか 5 とか、画像データの正解の数値が入ってるようです。
画像データの方のインデックス番号と、同じインデックス番号で見てみてください。