FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

ニューラルネットワーク C言語での実装 (5. バッチサイズの導入)

ニューラルネットワークを1からC言語で記述してMNISTを動作させるプロジェクト、次はバッチサイズを導入して一度に複数の画像を処理できるように拡張する。

バッチサイズを導入する前、つまり機能の時点でのネットワークの構成は、以下のようになっていた。一つの画像データに対して行列演算を実行し、答えを出す。

f:id:msyksphinz:20170629005855p:plain

これをバッチ処理を導入することにより、以下のように拡張する。

f:id:msyksphinz:20170628012908p:plain

この場合は、10000個のデータを一つの処理の中で実行している。このように一度に複数のデータに対して行列演算を実行することで、ネットワークの高速化を図ることができる。

このようにしてバッチサイズを導入し、MNISTを実装し直した。

github.com

データをファイルから取得するgetdata()は、バッチサイズ分だけ拡張してある。ここではdefine BATCHSIZE (100)としてあり、100個のデータを取得して一度にネットワークに流すようになっている。

int getdata (int fd_image, int fd_label, double in_data[BATCH_SIZE][INPUTNO], double *ans)
{
  uint8_t image[INPUTNO];
  for (int b = 0; b < BATCH_SIZE; b++) {
    read (fd_image, image, INPUTNO * sizeof(unsigned char));
    for (int j = 0; j < INPUTNO; j++) {
      in_data[b][j] = (double)image[j] / 256.0;
    }
    uint8_t label;
    read (fd_label, &label, sizeof(uint8_t));
    ans[b] = (double)label;
  }
}

これで、認識精度を落とさずにバッチサイズを導入したニューラルネットワークを構成できた。

さて、次は学習フェーズの実装だ。誤差逆伝搬法の実装を行っていこう。これも、Pythonから初期値データをもらいながら、検算して実装していく。