MNISTファイルの入手
MNISTの手書き画像データは下記のサイトで手に入れることができる。
そこでは4つのgzipファイルを解凍すると下記のファイルを入手することができるらしい…。
-
train-images-idx3-ubyte
→学習用画像 -
train-labels-idx1-ubyte
→学習用画像のラベル -
t10k-images-idx3-ubyte
→テスト用画像 -
t10k-labels-idx1-ubyte
→テスト用画像のラベル
学習用画像のファイル形式
TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).
学習用画像ファイル形式を確認してみる
上記のようなファイル形式になっているらしいので、実際に学習用画像ファイルの16バイト目まで見てみよ~。
#include <stdio.h>
#include <stdlib.h>
// 学習用画像ファイルがビッグエンディアンで保存されてるため
// 1バイトより大きいサイズのデータは一時格納用配列の中身は
// リトルエンディアンで格納しint型変数にはビッグエンディアン
// で格納する
void get_images_info(FILE *, int*);
// 画像の情報を取得する関数
// 引数:取得したい情報源のファイルポインタ
// 取得したい情報を保持する変数のアドレス
// 戻り値:なし
void get_images_info(FILE *fp, int *info){
int count; // カウンター
int status; // fread関数の戻り値
// 一時格納用配列(リトルエンディアンで保持)
char buff[4];
// 1バイトずつ取得
for(count=0;count<4;count++){
status=fread( (char *)&buff[count],1,sizeof(char),fp);
if(status < sizeof(char)){
printf("Reading Error\n"); // 読み込みエラー
exit(2);
}
}
// 一時格納用配列の中身(リトルエンディアン)をint型変数(ビッグエンディアン)に格納
*info = buff[0];
for(count=1;count<4;count++){
*info <<= 8;
*info += buff[count];
}
}
int main(void){
FILE *train_images_fp; // 学習用画像ファイルのポインタ
// int型変数(ビッグエンディアンで保持)
int magic_number;
int number_of_images;
int number_of_rows;
int number_of_columns;
// 学習用画像ファイルを開く
train_images_fp=fopen("train-images-idx3-ubyte","rb");
if(train_images_fp == NULL){
printf("Cannot open the train-images-idx3-ubyte\n"); // オープンエラー
exit(1);
}
// 画像の情報を取得
get_images_info(train_images_fp, &magic_number);
get_images_info(train_images_fp, &number_of_images);
get_images_info(train_images_fp, &number_of_rows);
get_images_info(train_images_fp, &number_of_columns);
// データの表示
printf("magic_number :0x%x\n",magic_number);
printf("number_of_images :%d\n",number_of_images);
printf("number_of_rows :%d\n",number_of_rows);
printf("number_of_columns :%d\n",number_of_columns);
// ファイルを閉じる
if(fclose(train_images_fp) != 0){
printf("Cannot close the rain-images-idx3-ubyte\n");
}
return 0;
}
結果
magic_number :0x803
number_of_images :60000
number_of_rows :28
number_of_columns :28
上記で示したファイル形式と同じ値がしっかり出ている!!!
次回
では、次回はGUN Octaveを使って実際に学習用画像を見てみる。