畳みこみニューラルネットを0から実装する (第1回)

1件のコメント

こんにちはtatsyです.

今、いろいろな分野でディープ・ラーニング(Deep Learning)が大流行しています。

最近ではディープ・ラーニングを使うだけなら、Theanoであったり、Caffeであったりといったライブラリなどが充実しており、0からこれを実装する必要性は薄いです。

とはいうものの、中身をある程度理解しようと思えば、自分で実装するに勝る学習法はないでしょう。というわけで、今回は畳みこみニューラルネット(Convolutional Neural Network)を最終目標としてディープ・ラーニングの手法を少しずつ実装していきたいと思います。

なお実装の都合上、for文を多用しますので、実行速度をそれなりに早くする目的で今回はC++を使って実装します。

行列の演算についてはソースコードが冗長になるのを防ぐためにEigenというライブラリを使います。
 

第1回の記事の内容


第1回の今回はMNISTという手書き文字の画像データをサイトから落としてきて,ライブラリで読めるようにするあたりまでをやってみたいと思います.
 

MNISTのデータ形式


MNISTというのは手書きの文字が28×28の白黒画像で保存されているデータベースです。本家のウェブページは以下になります。

http://yann.lecun.com/exdb/mnist/

このページの上の方に4つのファイルが置いてあります。これらには上から

  • トレーニング用の画像
  • トレーニング画像に対する数字のラベル
  • テスト用の画像
  • テスト画像に対する数字のラベル

が含まれています。


データ形式についての解説は先ほどのページの一番下に書かれています。

画像データ

バイト数 形式 内容
4 Byte 符号付き32ビット整数 マジック・ナンバー (2051)
4 Byte 符号付き32ビット整数 データの数 (トレーニング用は60000個、テスト用は10000個)
4 Byte 符号付き32ビット整数 画像の高さ (行数)
4 Byte 符号付き32ビット整数 画像の幅 (列数)
1 Byteずつ 符号なし8ビット整数 各画像の輝度値 (0-255)

ラベルデータ

バイト数 形式 内容
4 Byte 符号付き32ビット整数 マジック・ナンバー (2049)
4 Byte 符号付き32ビット整数 データの数 (トレーニング用は60000個、テスト用は10000個)
1 Byteずつ 符号なし8ビット整数 各画像に対するラベル (0-9)

なお画像、ラベルいずれのデータについても符号付32ビット整数はビッグ・エンディアンで保存されていますので読み取りには注意が必要です。
 

さて、ここまで理解できたら、ファイルをバイナリで読み込んでいけばよいだけなので、それほど難しくはないと思います。

以下にソースコードを示しておきます。適宜コメントを入れてありますので、参考にしていただけると嬉しいです。

なお以下のファイルでは、Eigenを使うためのusing宣言(typedef)やAssertion用のマクロ設定などをまとめたcommon.hというファイルがインクルードされています。

このファイルについては私のGitHubからご確認をいただければ幸いです。


ヘッダファイル (mnist.h)


ソースファイル (mnist.cpp)


これでMNISTの読み込みはできました。6万個のデータを読み込むと数秒くらいは時間がかかります。

第2回はシグモイド関数を使った通常のニューラルネットについて解説します。

最後までお読みいただき、ありがとうございました。

畳みこみニューラルネットを0から実装する (第1回)」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください