いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

画像認識の実験始め。CIFAR-10使います

 CIFAR-10というデータセットがあります。前、MNIST(エムニスト)というデータセットを使ったことがあります。これは0から9までの数字認識の実験などのための画像のセットで、何年か前にC#でプログラムを書いて数字認識を試しました。CIFAR-10は飛行機、自動車、鳥、……といった10種類(10クラス)の様々な画像それぞれ5000枚ずつ(多分……。全部で50000枚あるので、50000÷10=5000)と、それらが飛行機なのか、鳥なのか、……という正解ラベルのデータです。それぞれの画像は32×32ドット。CIFAR-100というのもあり、こちらは画像のサイズは同じですがデータ数、クラス数が多くなっています。

 今回はCIFAR-10を使い、写真をPCに見せて「これは馬」、「これは自動車」などと判断させる実験をやろうとしています。ImageNetというのもありますが、こちらは1400万枚以上、クラスは2万以上とのことなので、まずは小規模の実験で……とCIFAR-10を選びました。早速ダウンロード。ダウンロードにあたって参考にしたサイトは次です。

https://atmarkit.itmedia.co.jp/ait/articles/2006/10/news021.html

 MNISTの時のことは細かなことは忘れており、「画像のデータセットって、bmpなのか、jpgなのか、どんなファイル形式なんだろう?」などと思っていたんですが、シンプルに画像の各点の輝度の並びでした。ダウンロードして説明を読んでみると、

正解ラベル1バイト, R(赤)のデータ1024バイト,G(緑)のデータ1024バイト,B(青)のデータ1024バイト

で32×32ドット分のデータです。これが画像の枚数、5万枚分揃っているというわけです(1万枚ずつ、5つのファイルに分けられている)。従って、例えばこれらのデータを画像としてPCで表示するためにはbmpならbmpの、jpgならjpgの画像のデータ形式に合わせてデータを並べ直し、画像ファイル形式それぞれに特有の必要な情報をつけ加えて画像ファイルにすればよいのです。ダウンロードしたデータは「ホントに画像なんだろうね?」と思って、一応見ておきたかったのですが、面倒なのでぼくはVisualStudioでPictureBoxをフォームに貼り付け、1列1024×3バイトの画像データを32×32に並べ直して見てみました。使った言語はC#です。今時のPCですから画面のドットは細かく、32×32というのが意外に小さな区画であることに少し驚きましたが、いくつか試したらちゃんと馬や船に見えたので安心しました。

 これがすべての始まりです。この先、流行り(?)のTensorFlowやscikit-learnなどは使いません。触ったことがないので分かりませんが、TensorFlowなどでやれば多分この程度の実験ならすぐにできるのでしょう。そうして「おお、これは凄い!」というのも大変大事だと思います。自分の目で見て手で触って、という体験が次の勉強につながるのですから。しかし、それだけで「深層学習とは何なのか」理解できるとは思えませんし、理論的な部分の勉強になるはずがありません。一番大事なのは自分の頭で理屈を(数式で)理解し、小規模の実験でよいので自分でプログラムを書いて試すことだと思います。そうした上で、TensorFlowなどを使うのが本当なのではないか……という気がします。自分で一から畳み込み層を作って、プーリングして、クラス認識するのです。画像の正規化、白色化も全部自分で。これが勉強。

 余裕を見て画像認識、進めます。しばらく楽しめそうです。

 

追記:

『深層学習』(岡谷貴之2015講談社)には、局所コントラスト正規化は1つの層で実現でき、逆伝播も可能、とあります。逆伝播の具体的な式がなかったので自分で導きました。試してみたくてウズウズしています。

 

追記2:

CIFAR-10は「see far ten」と読むそうな。Qiita、その他のサイトにあります。「サイファー」かと思ってた……。