Mind で Neural Network (準備編3) 文字画像の読み込みの改良

# 概要
Mind言語で MNISTの文字認識を行うニューラルネットワークを実装していきます。
本記事では、以前の「[Mind で Neural Network (準備編1) 文字画像の読み込み](http://qiita.com/drafts/96a58f6a34b0d3b04511)」を、読み込み時間の短縮を行った 改良版の記事です。
「[Mind で Neural Network (準備編1) 文字画像の読み込み](http://qiita.com/drafts/96a58f6a34b0d3b04511)」のコメント欄にて、Killy さん から頂いたアドバイスをもとに改良しました。

# 変更内容
||以前|本改良|
|:--|:--------|:--------|
|1|ファイルからの１Byte毎単位で読み出し　小数化し　配列に格納していた。　|ファイル内容を一旦全てバッファメモリに読み込み、メモリから読み出した値を小数化し、配列に格納する。|
|2|ループ内の回数を、変数に代入していた。|ループ内の回数を示すカウンタを、そのまま用いる。|


#所要時間の変化
MNIST の文字認識用ファイル4ファイル: 合計 60MB弱)の 読み出し時間の変化

|以前|本改良|
|:--------:|:--------:|
| 94(s)|12(s)|


#ソースコード

```mind:MNISTfiles.src
※ 定数定義 ※
ファイル格納場所は　文字列定数　"C:\data\MNIST\"。

入力画像数は　数値　60000。
検証画像数は　数値　10000。

※入力画像数は　数値　10000。
※検証画像数は　数値　1000。

合計画像数は　数値　入力画像数に　検証画像数を　加えたもの。

画素数は　数値　784。
分類数は　数値　10。

画像構造体は　構造体
			輝度値は　小数変数
		画像は
			画素数の　輝度値
		全体は
			合計画像数の　画像
。


正否構造体は　構造体
			正否は　小数変数
			正解値は　変数
		正否一組は
			正解値と
			分類数の 正否
		全体は
			合計画像数の　正否一組
。


入力画像ファイル名は　文字列定数		"train-images-idx3-ubyte"。
入力画像正解値ファイル名は　文字列定数	"train-labels-idx1-ubyte"。
検証画像ファイル名は　文字列定数		"t10k-images-idx3-ubyte"。
検証画像正解値ファイル名は　文字列定数	"t10k-labels-idx1-ubyte"。


読込ファイルは　ファイル　長さ　０。	※：わざとサイズ０にする

入力画像輝度値の読込サイズは　数値　入力画像数に　画素数を　掛けたもの。　※←45MB
検証画像輝度値の読込サイズは　数値　検証画像数に　画素数を　掛けたもの。　※←7.5MB


ファイル読込バッファは　データ領域　長さ　入力画像輝度値の読込サイズ。※最大サイズの物を割り当てる


画像ファイルのヘッダを読み飛ばしとは　（・　→　・）
				＿ヘッダ域は　データ領域　長さ　１６
		読込ファイルから　＿ヘッダ域に　読み出すこと
。


正解値ファイルのヘッダを読み飛ばしとは　（・　→　・）
				＿ヘッダ域は　データ領域　長さ　８
		読込ファイルから　＿ヘッダ域に　読み出すこと
。


入力画像輝度値の読込とは　（・　→　・）
			ワーク領域は　文字列
			Ｉは　外側回数と　等価		
			Ｊは　　　回数と　等価		
	※--- ファイルの読み出し ---
		読込ファイルから　ファイル読込バッファに　読み出し　　※(一気に読み出し)

	※--- 内容を計算し配列に格納 ---
		ファイル読込バッファを　ワーク領域に　入れ
		入力画像数を　回数指定し
			画素数を　回数指定し
				ワーク領域から　一バイト切り出し　　　※(バッファから１byte取り出し)
				小数化し　255.0で　f割りし　輝度値(Ｉ,Ｊ)に　入れる
			繰り返す
		繰り返す
。


検証画像輝度値の読込とは　（・　→　・）
			ローカルバッファは　構造体情報　※「ファイル読込バッファ」前半を流用
			ワーク領域は　文字列
			Ｉは　　　変数
			Ｊは　　　回数と　等価

	※--- ファイルの読み出し ---
		ファイル読込バッファを　検証画像輝度値の読込サイズで　サイズ変更し　
			ローカルバッファに　入れ
		読込ファイルから　ローカルバッファに　読み出し　　※(一気に読み出し)

	※--- 内容を計算し配列に格納 ---
		ローカルバッファを　ワーク領域に　入れ
		入力画像数を　Ｉに　入れ
		検証画像数を　回数指定し
			Ｉを　一つ増加し
			画素数を　回数指定し
				ワーク領域から　一バイト切り出し
					小数化し　255.0で　f割りし　輝度値(Ｉ,Ｊ)に　入れる
			繰り返す
		繰り返す
。


入力画像正解値の読込とは　（・　→　・）
			ローカルバッファは　構造体情報　※「ファイル読込バッファ」前半を流用
			ワーク領域は　文字列
			読込値は　変数
			Ｉは　　　回数と　等価		

	※--- ファイルの読み出し ---
		ファイル読込バッファを　入力画像数で　サイズ変更し　
			ローカルバッファに　入れ
		読込ファイルから　ファイル読込バッファに　読み出し　　※(一気に読み出し)

	※--- 内容を計算し配列に格納 ---
		ファイル読込バッファを　ワーク領域に　入れ
		入力画像数を　回数指定し
		
			ワーク領域から　一バイト切り出し　　　※(バッファから１byte取り出し)
				正解値(I)に　入れる
				
			正解値(I)に　1を　加え　読込値に　入れる
			f1.0を　正否(Ｉ,読込値)に　入れる

		繰り返す
。

検証画像正解値の読込とは　（・　→　・）
			ローカルバッファは　構造体情報　※「ファイル読込バッファ」前半を流用
			ワーク領域は　文字列
			読込値は　変数
			Ｉは　　　変数

		入力画像数を　Ｉに　入れる　
	※--- ファイルの読み出し ---
		ファイル読込バッファを　検証画像数で　サイズ変更し　
			ローカルバッファに　入れ
		読込ファイルから　ファイル読込バッファに　読み出し　　※(一気に読み出し)

	※--- 内容を計算し配列に格納 ---
		ファイル読込バッファを　ワーク領域に　入れ
		検証画像数を　回数指定し
			Ｉを　一つ増加し
			ワーク領域から　一バイト切り出し　　　※(バッファから１byte取り出し)
				正解値(I)に　入れる
				
			正解値(I)に　1を　加え　読込値に　入れる
			f1.0を　正否(Ｉ,読込値)に　入れる
			
		繰り返す
。


ＭＮＩＳＴファイル読込とは
			ファイル名は　文字列変数
			輝度算出は　小数変数
			Ｉは　変数
			Ｊは　変数
			開始時刻値は　変数
			終了時刻値は　変数

		画像構造体を　クリア
		正否構造体を　クリア
		
		日時を値で得て　開始時刻値に　入れる

	※ ---- 入力画像ファイル ----
		ファイル格納場所を　ファイル名に　入れる
		入力画像ファイル名を　ファイル名に　 追加
		ファイル名を　表示し、　「　読込開始」を　表示し、　改行
		
		ファイル名で　読込ファイルを　オープンする
		エラー？
			ならば　エラー文字列で　重大エラーにし
			つぎに
			
		※ ヘッダー部読み飛ばし
		画像ファイルのヘッダを読み飛ばし

		※　輝度値の読込
		入力画像輝度値の読込

		読込ファイルを　クローズする
		「読込完了」を　表示し、　改行

	※ ---- 検証画像ファイル ----
		ファイル格納場所を　ファイル名に　入れる
		検証画像ファイル名を　ファイル名に　 追加
		ファイル名を　表示し、　「　読込開始」を　表示し、　改行
		
		ファイル名で　読込ファイルを　オープンする
		エラー？
			ならば　エラー文字列で　重大エラーにし
			つぎに
			
		※ ヘッダー部読み飛ばし
		画像ファイルのヘッダを読み飛ばし

		※　輝度値の読込
		検証画像輝度値の読込

		読込ファイルを　クローズする
		「読込完了」を　表示し、　改行
		
		
	※ ---- 入力画像正解値ファイル ----
		ファイル格納場所を　ファイル名に　入れる
		入力画像正解値ファイル名を　ファイル名に　 追加
		ファイル名を　表示し、　「　読込開始」を　表示し、　改行

		ファイル名で　読込ファイルを　オープンする
		エラー？
			ならば　エラー文字列で　重大エラーにし
			つぎに
			
		※ ヘッダー部読み飛ばし
		正解値ファイルのヘッダを読み飛ばし

		※　正否の読込
		入力画像正解値の読込

		読込ファイルを　クローズする
		「読込完了」を　表示し、　改行

		
	※ ---- 検証画像正解値ファイル ----
		ファイル格納場所を　ファイル名に　入れる
		検証画像正解値ファイル名を　ファイル名に　 追加
		ファイル名を　表示し、　「　読込開始」を　表示し、　改行

		ファイル名で　読込ファイルを　オープンする
		エラー？
			ならば　エラー文字列で　重大エラーにし
			つぎに
			
		※ ヘッダー部読み飛ばし
		正解値ファイルのヘッダを読み飛ばし

		※　正否の読込
		検証画像正解値の読込

		読込ファイルを　クローズする
		「読込完了」を　表示し、　改行


		日時を値で得て　終了時刻値に　入れる
		[　終了時刻値　-　開始時刻値　]を　数値表示し、　「(秒)」を　表示し、　改行 
。


小数２桁表示とは　（小数　→　・）
    2桁で　小数形式で表示すること。

ＭＮＩＳＴ画像表示とは　関数　整数入力(画像番号)
			画像番号は　変数
			Iは　変数
	画像番号に　入れる

	「画像番号：」を　表示し、　画像番号を　数値表示し、
	「　正解値：」を　表示し　正解値(画像番号)を　数値表示し、

※	分類数を　回数指定し、回数を　Iに　入れる
※		Iを　数値表示し、　「:」を　表示し　正否( 画像番号, I)を　小数２桁表示し、　「, 」を　表示し
※	繰り返す

	画素数を　回数指定し、回数を　Iに　入れる
		[I ％ 28]が　1に　等しい
			ならば　改行し
			つぎに

		輝度値( 画像番号, I)が　0.5　f以上　ならば　
				「■」を　表示し　
			さもなければ　
				「□」を　表示し　
			つぎに
	繰り返す
。


メインとは
※MNISTfile＿テスト＿メインとは
	ＭＮＩＳＴファイル読込
	
	ＭＮＩＳＴ画像表示(1)し、　改行
	ＭＮＩＳＴ画像表示(59999)し、　改行
	ＭＮＩＳＴ画像表示(60000)し、　改行
	ＭＮＩＳＴ画像表示(60001)し、　改行
	ＭＮＩＳＴ画像表示(69999)し、　改行
	ＭＮＩＳＴ画像表示(70000)し、　改行
※	ＭＮＩＳＴ画像表示(70001)し、　改行		※意図したとおりエラーとなった。
	
	スタック検査し
。

```

#次記事
[Mind で Neural Network (adam)](http://qiita.com/t-tkd3a/items/876fa2322e770046f1b4)