Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

変更内容

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

所要時間の変化

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

以前 本改良
94(s) 12(s)

ソースコード

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"。


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

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


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


画像ファイルのヘッダを読み飛ばしとは (・ → ・)
                _ヘッダ域は データ領域 長さ 16
        読込ファイルから _ヘッダ域に 読み出すこと
。


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


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

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


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

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

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


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

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

    ※--- 内容を計算し配列に格納 ---
        ファイル読込バッファを ワーク領域に 入れ
        入力画像数を 回数指定し

            ワーク領域から 一バイト切り出し   ※(バッファから1byte取り出し)
                正解値(I)に 入れる

            正解値(I)に 1を 加え 読込値に 入れる
            f1.0を 正否(I,読込値)に 入れる

        繰り返す
。

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

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

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

            正解値(I)に 1を 加え 読込値に 入れる
            f1.0を 正否(I,読込値)に 入れる

        繰り返す
。


MNISTファイル読込とは
            ファイル名は 文字列変数
            輝度算出は 小数変数
            Iは 変数
            Jは 変数
            開始時刻値は 変数
            終了時刻値は 変数

        画像構造体を クリア
        正否構造体を クリア

        日時を値で得て 開始時刻値に 入れる

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

        ファイル名で 読込ファイルを オープンする
        エラー?
            ならば エラー文字列で 重大エラーにし
            つぎに

        ※ ヘッダー部読み飛ばし
        画像ファイルのヘッダを読み飛ばし

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

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

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

        ファイル名で 読込ファイルを オープンする
        エラー?
            ならば エラー文字列で 重大エラーにし
            つぎに

        ※ ヘッダー部読み飛ばし
        画像ファイルのヘッダを読み飛ばし

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

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


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

        ファイル名で 読込ファイルを オープンする
        エラー?
            ならば エラー文字列で 重大エラーにし
            つぎに

        ※ ヘッダー部読み飛ばし
        正解値ファイルのヘッダを読み飛ばし

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

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


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

        ファイル名で 読込ファイルを オープンする
        エラー?
            ならば エラー文字列で 重大エラーにし
            つぎに

        ※ ヘッダー部読み飛ばし
        正解値ファイルのヘッダを読み飛ばし

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

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


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


小数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)し、 改行       ※意図したとおりエラーとなった。

    スタック検査し
。

次記事

Mind で Neural Network (adam)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away