Juliaで学ぶ画像処理〜ニューラルネットワーク(Neural Network) part1〜

目次

こんにちは!今回は前回に引き続き、プログラミング言語のJuliaを用いて画像処理をしていきます。

インストールやサンプルプログラムを動かしていない方は以下をご覧ください。
プログラミング言語Juliaで学ぶ画像処理〜インストール、サンプル実行〜

1. 今回の内容について

今回はニューラルネットワークを使って手書き文字認識をしてみます。手書き文字認識とは、以下のような手書きの数字が何であるかを識別する手法です。

例えば以下のような手書き文字をみてみましょう。これは 8 x 8 の大きさの画像です。

今回することは、以下のようにある識別器にこの画像を入れると、その数字が0というのを出力する識別器を作ることです。ニューラルネットワークについての詳しい内容は考えず、とりあえず動かしてみることにします。

2. 用いるライブラリについて

Juliaでは、機械学習のためのライブラリとして'Mocha'というものを使うことができます。これはpythonで使える機械学習ライブラリの'Caffe'から来たものだと思います。どのようなものかを知るためにざっとDocumentをみてみましょう。
Mocha.jl is a deep learning library for Julia, a new programming language created at MIT that is designed specifically for scientific and numerical computing. Julia is a general-purpose language with many advanced features including type inference and multiple dispatch. Moreover, Julia’s performance in benchmarks is almost comparable to C code. While still at a very young stage, Julia is becoming popular in the numerical computing world. Mocha.jl has a number of nice features and benefits, including the following.
どうやらMochaはJuliaのためのDeepLeaningのライブラリであり、それを使うには単にadd('Mocha')とすればよいようです。これは簡単そうですね!

3. データのインストール

手書き文字のデータをインストールします。まずは右のページにいって、Mochaのファイルをクローンしましょう。Mocha(https://github.com/pluskid/Mocha.jl)

これをするとMocha.jl-masterというフォルダができます。その中の/examples/mnist/のフォルダに移動してください。そこで以下のようなコマンドを実行するとファイルがインストールされます。

なお、これを行うにはwgetが必要なようです。

このようなエラーが出る際には、

とするとwgetのインストールができます。

一連の操作により、mnist/data/の中にtest.hdf5、train.hdf5というファイルがインストールされたと思います。これらが今回学習で用いるデータになります。

4. プログラム

今回のプログラムは右のサイトを参考しました。
Mochaのサンプルプログラム(http://mochajl.readthedocs.io/en/latest/tutorial/mnist.html

以下、環境は前回と同じJupyterを使っていきます。

まず必要なパッケージをインストールします。

訓練データを読み出します。今回のファイルはhdf5の形式で書かれています。
(HDF5ファイルについてはこの記事がわかりやすいです。hdf5について(http://yukisakamoto.hatenablog.com/entry/20130413/1365825028))

次にニューラルネットワークとして層を定義します。今回は以下のような層構造のものを使います。

ニューラルネットワークはパラメータを少しずつ調整していくことで精度をよくしていく方法です。損失関数を以下のように定義し、これを評価の対象とします。

ソフトマックス関数はシグモイド関数と呼ばれる関数の多次元バージョンで、多変量解析や多クラスのフィードフォワード型のニューラルネットワークに用いられるようです。直感的には、誤識別した確率のようなものと思っていただいてよいと思います。loss_layerを小さくすることでtraindataの識別能力が上がります。



さて、いよいよニューラルネットワークを動かす準備をします。以下のような定義でネットワークを構築しているようです。この定義は他の例を実行する際にも有用であるように思います。

今回はSGDと呼ばれる方法でニューラルネットワークを更新していきます。以下のコードで反復回数を10000回に設定し、様々なパラメータの設定をしています。

setup_coffee_loungeやadd_coffee_breakなど、関数の名前がユニークですね。どうやらsetup_coffee_loungeでは1000回の反復ごとのデータを保存、add_coffee_breakでは100回ごとの学習の結果を報告してくれるようです。

最後に以下のように書いて、学習がスタートします。

5. 実行結果

以下のような結果になれば学習されています。

これで学習がされました。学習された結果は/snapshotsのフォルダに新しくファイルが作られていると思います。最終的な結果は

と得られました。次の記事ではこれを用いて新しい画像に関してどのような汎化性能を持つか調べていきます。