概要
Mind言語で MNISTの文字認識を行うニューラルネットワークを実装していきます。
本記事では、準備編として MNISTの画像データを読み込むルーチン部分 のソースコードと、実行結果を公開します。
高速化についてのアドバイスが頂けると助かります。
(追記) Killy さんから頂いたアドバイスをもとに、改良版を作成しました→「Mind で Neural Network (準備編3) 文字画像の読み込みの改良」
#背景
Deep Learning についての勉強をはじめました。
基本の ニューラルネットワークを 実装できる程度に理解することを 第一の目標としてます。
参考図書として
を用いてます。
読み進めながら 処理の内容を 疑似コードで メモ書きしていたところ、
『日本語プログラミング言語「Mind」最新版をリリースしました』の記事に出会い、言語仕様を調べたところ、メモ書きの 疑似コードが そのまま動きそうな予感で テンション上がり Mind で実装していくことにしました。
#ソースコード (改良前)
※ 定数定義 ※
ファイル格納場所は 文字列定数 "C:\data\MNIST\"。 ※格納先に合わせて変更すること
入力画像数は 数値 60000。
検証画像数は 数値 10000。
合計画像数は 数値 70000。
画素数は 数値 784。
分類数は 数値 10。
入力画像ファイル名は 文字列定数 "train-images-idx3-ubyte"。
入力画像正解値ファイル名は 文字列定数 "train-labels-idx1-ubyte"。
検証画像ファイル名は 文字列定数 "t10k-images-idx3-ubyte"。
検証画像正解値ファイル名は 文字列定数 "t10k-labels-idx1-ubyte"。
※ 入力画像と検証画像は 分けずに 同じ構造体に格納する ※
画像構造体は 構造体
輝度値は 小数変数
画像は
画素数の 輝度値
全体は
合計画像数の 画像
。
正否構造体は 構造体
正否は 小数変数
正解値は 変数
正否一組は
正解値と
分類数の 正否
全体は
合計画像数の 正否一組
。
読込ファイルは ファイル。
MNISTファイル読込とは
ファイル名は 文字列変数
読込値は 変数
輝度算出は 小数変数
Iは 変数
Jは 変数
画像構造体を クリア
正否構造体を クリア
※ ---- 入力画像ファイル ----
ファイル格納場所を ファイル名に 入れる
入力画像ファイル名を ファイル名に 追加
ファイル名を 表示し、 「 読込開始」を 表示し、 改行
ファイル名で 読込ファイルを オープンする
エラー?
ならば エラー文字列で 重大エラーにし
つぎに
※ ヘッダー部読み飛ばし
16を 回数指定し
読込ファイルから 一バイト読み出し 読込値に 入れる
※ 読込値を 数値表示し、 「 」を 表示し
繰り返す
※ 輝度値の読込
入力画像数を 回数指定し、回数を Iに 入れる
画素数を 回数指定し、回数を Jに 入れる
読込ファイルから 一バイト読み出し 読込値に 入れる
読込値を 小数化し 255.0で f割りし 輝度値(I,J)に 入れる
繰り返す
繰り返す
読込ファイルを クローズする
「読込完了」を 表示し、 改行
※ ---- 検証画像ファイル ----
ファイル格納場所を ファイル名に 入れる
検証画像ファイル名を ファイル名に 追加
ファイル名を 表示し、 「 読込開始」を 表示し、 改行
ファイル名で 読込ファイルを オープンする
エラー?
ならば エラー文字列で 重大エラーにし
つぎに
※ ヘッダー部読み飛ばし
16を 回数指定し
読込ファイルから 一バイト読み出し 読込値に 入れる
※ 読込値を 数値表示し、 「 」を 表示し
繰り返す
※ 輝度値の読込
検証画像数を 回数指定し、回数を Iに 入れる
Iに 入力画像数を 加え Iに 入れる
画素数を 回数指定し、回数を Jに 入れる
読込ファイルから 一バイト読み出し 読込値に 入れる
読込値を 小数化し 255.0で f割りし 輝度値(I,J)に 入れる
繰り返す
繰り返す
読込ファイルを クローズする
「読込完了」を 表示し、 改行
※ ---- 入力画像正解値ファイル ----
ファイル格納場所を ファイル名に 入れる
入力画像正解値ファイル名を ファイル名に 追加
ファイル名を 表示し、 「 読込開始」を 表示し、 改行
ファイル名で 読込ファイルを オープンする
エラー?
ならば エラー文字列で 重大エラーにし
つぎに
※ ヘッダー部読み飛ばし
8を 回数指定し
読込ファイルから 一バイト読み出し 読込値に 入れる
※ 読込値を 数値表示し、 「 」を 表示し
繰り返す
※ 正否の読込
入力画像数を 回数指定し、回数を Iに 入れる
読込ファイルから 一バイト読み出し 読込値に 入れる
読込値を 正解値(I)に 入れる
読込値に 1を 加え 読込値に 入れる
f1.0を 正否(I,読込値)に 入れる
繰り返す
読込ファイルを クローズする
「読込完了」を 表示し、 改行
※ ---- 検証画像正解値ファイル ----
ファイル格納場所を ファイル名に 入れる
検証画像正解値ファイル名を ファイル名に 追加
ファイル名を 表示し、 「 読込開始」を 表示し、 改行
ファイル名で 読込ファイルを オープンする
エラー?
ならば エラー文字列で 重大エラーにし
つぎに
※ ヘッダー部読み飛ばし
8を 回数指定し
読込ファイルから 一バイト読み出し 読込値に 入れる
※ 読込値を 数値表示し、 「 」を 表示し
繰り返す
※ 正否の読込
検証画像数を 回数指定し、回数を Iに 入れる
Iに 入力画像数を 加え Iに 入れる
読込ファイルから 一バイト読み出し 読込値に 入れる
読込値を 正解値(I)に 入れる
読込値に 1を 加え 読込値に 入れる
f1.0を 正否(I,読込値)に 入れる
繰り返す
読込ファイルを クローズする
「読込完了」を 表示し、 改行
。
小数2桁表示とは (小数 → ・)
2桁で 小数形式で表示すること。
MNIST画像表示とは 関数 整数入力(画像番号)
画像番号は 変数
Iは 変数
画像番号に 入れる
「画像番号:」を 表示し、 画像番号を 数値表示し、
「 正解値:」を 表示し 正解値(画像番号)を 数値表示し、
※ 分類数を 回数指定し、回数を Iに 入れる
※ Iを 数値表示し、 「:」を 表示し 正否( 画像番号, I)を 小数2桁表示し、 「, 」を 表示し
※ 繰り返す
画素数を 回数指定し、回数を Iに 入れる
[I % 28]が 1に 等しい
ならば 改行し
つぎに
輝度値( 画像番号, I)が 0.5 f以上 ならば
「■」を 表示し
さもなければ
「□」を 表示し
つぎに
繰り返す
。
メインとは
※MNISTfile_テスト_メインとは
MNISTファイル読込
MNIST画像表示(1)し、 改行
MNIST画像表示(59999)し、 改行
MNIST画像表示(60000)し、 改行
MNIST画像表示(60001)し、 改行
MNIST画像表示(69999)し、 改行
MNIST画像表示(70000)し、 改行
※ MNIST画像表示(70001)し、 改行 ※意図したとおりエラーとなった。
スタック検査し
。
#実行結果
「MNIST 文字データへのリンク」 から下記のファイルをダウンロードし、
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
ソースコード上に記した格納先(例:C:\data\MNIST)に展開済みとします。
C:\Working\Mind\t02_NN>mind MNISTfiles file
日本語プログラミング言語 Mind Version 8.0 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\Mind\pmind\bin\mindex.exe --> MNISTfiles.exe
C:\Working\Mind\t02_NN>MNISTfiles.exe
C:\data\MNIST\train-images-idx3-ubyte 読込開始
読込完了
C:\data\MNIST\t10k-images-idx3-ubyte 読込開始
読込完了
C:\data\MNIST\train-labels-idx1-ubyte 読込開始
読込完了
C:\data\MNIST\t10k-labels-idx1-ubyte 読込開始
読込完了
画像番号:1 正解値:5
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□■■□■■■□□□□□
□□□□□□□□□□□■■■■■■■■■■■■□□□□□
□□□□□□□□■■■■■■■■■■□□□□□□□□□□
□□□□□□□□■■■■■■■■■■□□□□□□□□□□
□□□□□□□□□■□■■■□□□■□□□□□□□□□□
□□□□□□□□□□□■■□□□□□□□□□□□□□□□
□□□□□□□□□□□■■■□□□□□□□□□□□□□□
□□□□□□□□□□□□■■□□□□□□□□□□□□□□
□□□□□□□□□□□□□■■■□□□□□□□□□□□□
□□□□□□□□□□□□□□■■■□□□□□□□□□□□
□□□□□□□□□□□□□□□■■■■□□□□□□□□□
□□□□□□□□□□□□□□□□□■■■□□□□□□□□
□□□□□□□□□□□□□□□□□■■■□□□□□□□□
□□□□□□□□□□□□□□□■■■■■□□□□□□□□
□□□□□□□□□□□□□■■■■■■■□□□□□□□□
□□□□□□□□□□□□■■■■■■□□□□□□□□□□
□□□□□□□□□□■■■■■■□□□□□□□□□□□□
□□□□□□□■■■■■■■□□□□□□□□□□□□□□
□□□□□■■■■■■■■□□□□□□□□□□□□□□□
□□□□■■■■■■■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
画像番号:59999 正解値:6
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■■□□□□□□□
□□□□□□□□□□□□□□□□□□■■■□□□□□□□
□□□□□□□□□□□□□□□□□■■■□□□□□□□□
□□□□□□□□□□□□□□□□■■■□□□□□□□□□
□□□□□□□□□□□□□□□□■■□□□□□□□□□□
□□□□□□□□□□□□□□□■■□□□□□□□□□□□
□□□□□□□□□□□□□■■■□□□□□□□□□□□□
□□□□□□□□□□□□■■■□□□□□□□□□□□□□
□□□□□□□□□□□■■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■□□□□□□□□□□□□□□□
□□□□□□□□□□■■□□□□□□□□□□□□□□□□
□□□□□□□□□□■□□□□□□□□■■■■□□□□□
□□□□□□□□□■■□□□□□□■■■■■■□□□□□
□□□□□□□□■■□□□□□■■■■□□■■□□□□□
□□□□□□□□■■□□□□■■■□□□□■■□□□□□
□□□□□□□■■□□□□□■■□□□□■■□□□□□□
□□□□□□□■□□□□□□□□□□■■□□□□□□□□
□□□□□□□■■□□□□□□■■■■□□□□□□□□□
□□□□□□□■■■□■■■■■□□□□□□□□□□□□
□□□□□□□■■■■■■□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
画像番号:60000 正解値:8
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□■■■■■□□□□□□□□
□□□□□□□□□□□□□■■■■■■■■□□□■■□□
□□□□□□□□□□□□■■□□□□□□■□□■■□□□
□□□□□□□□□□□■■□□□□□□□■■■■□□□□
□□□□□□□□□□□■□□□□□□□□■■■□□□□□
□□□□□□□□□□■■□□□□□□■■■□□□□□□□
□□□□□□□□□□■□□□□□■■■□□□□□□□□□
□□□□□□□□□□■■□□□■■■□□□□□□□□□□
□□□□□□□□□□■■□■■■□□□□□□□□□□□□
□□□□□□□□□□■■■■□□□□□□□□□□□□□□
□□□□□□□□□□■■■□□□□□□□□□□□□□□□
□□□□□□□□□■■■□□□□□□□□□□□□□□□□
□□□□□□□■■■□■□□□□□□□□□□□□□□□□
□□□□□□□■■□□■□□□□□□□□□□□□□□□□
□□□□□□■■■□□■■□□□□□□□□□□□□□□□
□□□□□□□■■□□■□□□□□□□□□□□□□□□□
□□□□□□□■■■■■□□□□□□□□□□□□□□□□
□□□□□□□□■■■□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
画像番号:60001 正解値:7
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□■■■□□□□□□□□□□□□□□□□□□
□□□□□□■■■■■■■■■■■■■■■□□□□□□□
□□□□□□□□□□■■■■■■■■■■■■□□□□□□
□□□□□□□□□□□□□□□□□□□■■□□□□□□□
□□□□□□□□□□□□□□□□□□□■■□□□□□□□
□□□□□□□□□□□□□□□□□□■■□□□□□□□□
□□□□□□□□□□□□□□□□□■■■□□□□□□□□
□□□□□□□□□□□□□□□□□■■□□□□□□□□□
□□□□□□□□□□□□□□□□■■■□□□□□□□□□
□□□□□□□□□□□□□□□□■■□□□□□□□□□□
□□□□□□□□□□□□□□□□■■□□□□□□□□□□
□□□□□□□□□□□□□□□■■□□□□□□□□□□□
□□□□□□□□□□□□□□■■■□□□□□□□□□□□
□□□□□□□□□□□□□■■■□□□□□□□□□□□□
□□□□□□□□□□□□□■■□□□□□□□□□□□□□
□□□□□□□□□□□□■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■■□□□□□□□□□□□□□□
□□□□□□□□□□□■■□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
画像番号:69999 正解値:5
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□■■■■□□□□■■■■■■■□
□□□□□□□□□□□■■■■■■■■■■■■■■■□□
□□□□□□□□□□□■■■■■■■■■■■■□□□□□
□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□□■■■■■■□□□□□□□□□□□□
□□□□□□□□□□□■■■■■■□□□□□□□□□□□
□□□□□□□□■□□□□□■■■□□□□□□□□□□□
□□□□□□□□■■□□□□■■■□□□□□□□□□□□
□□□□□□□■■□□□□□■■■□□□□□□□□□□□
□□□□□□□■■■□□□□■■■□□□□□□□□□□□
□□□□□□□□■■■□■■■■■□□□□□□□□□□□
□□□□□□□□■■■■■■■■□□□□□□□□□□□□
□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
画像番号:70000 正解値:6
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□■■□□□□□□□
□□□□□□□□□□□□□□□□□■■■■■□□□□□□
□□□□□□□□□□□□□□□■■■■■□□□□□□□□
□□□□□□□□□□□□□■■■■■■□□□□□□□□□
□□□□□□□□□□■■■■■■■■□□□□□□□□□□
□□□□□□□□□□□□■■■■■□□□□□□□□□□□
□□□□□□□□□□□□■■■■□□□□□□□□□□□□
□□□□□□□□□□□■■■■□□□□□□□□□□□□□
□□□□□□□□□□■■■■■□□□□□□□□□□□□□
□□□□□□□□□■■■■□□□□□□□□□□□□□□□
□□□□□□□□■■■■□□□□□□□□□□□□□□□□
□□□□□□□□■■■■□□□□□□■■■■■□□□□□
□□□□□□□■■■■□□□□□■■■■■■■■□□□□
□□□□□□■■■■□□□■■■■■■■■■■■□□□□
□□□□□□■■■■□■■■■■■■■■■■■■□□□□
□□□□□□■■■■□■■■■□□□□□■■■□□□□□
□□□□□□■■■■■■■■□□□□□■■■■□□□□□
□□□□□□□■■■■■■■■■■■■■■■□□□□□□
□□□□□□□■■■■■■■■■■■■■□□□□□□□□
□□□□□□□□□■■■■■■■■■□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
□□□□□□□□□□□□□□□□□□□□□□□□□□□□
ずれ等なく 読み込めてる。
#改良したいこと
4つのファイルを読み込み完了するまでに、手元の環境で100秒近く要しています。
ファイルから1Byteづつ読み出しているからかと想像するのですが、
Mindで まとめ読み等で 時間短縮する方法はないものでしょうか…。
(ニューラルネットワークの学習の時間に比べたら、短いと言えば短いのですが…)