Juliaで学ぶ画像処理〜cifar-datasetsでニューラルネットワーク〜

今回も前回に引き続き、ニューラルネットワークを実装する方法についてご紹介します。

目次

1. 今回用いるデータについて

こんにちは、今回も前回に引き続き、ニューラルネットワークを実装していきたいと思います。前回の記事は以下からご覧ください。

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

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

① 10個の分類画像

こんなことができると夢が広がりますよね!これを可能にするのが機械学習、ニューラルネットワークです。

2. 用いるニューラルネットについて

今回は入力として(32,32,3)の画像を考えます。32 x 32 の画像にRGBの3つの色の値があります。

・ConvolutionLayer(name="conv1", n_filter=20, kernel=(5,5),bottoms=[:data], tops=[:conv1])

たたみ込み層です。(5,5)の大きさのたたみ込みを行います。n_filterはフィルターの数になってます。以下の図は「Convolutional Neural Networkを実装する(http://qiita.com/icoxfog417/items/5aa1b3f87bb294f84bac#_reference-1e2766fa43d0bc1f8af5)」を参考にしました。

② Convolution

この層の出力は(32,32,20)となります。



・PoolingLayer(name="pool1", kernel=(2,2), stride=(2,2),bottoms=[:conv1], tops=[:pool1])

プーリングと呼ばれる操作を行います。プーリングは前の出力層を粗くするリサンプリングする操作になりますが、これにより画像の多少のズレによる見え方の違いを吸収することが可能になります。

③ プーリングの様子

・InnerProductLayer(name="ip1", output_dim=500, neuron=Neurons.ReLU(), bottoms=[:pool2], tops=[:ip1])

ネットワークの重みと出力層との重みとの内積を計算し、それを出力します。ここで用いられるneuronとは、計算された値によって出力層をどのように決めるかというのを決定したものです。今回はReLUですので、以下のようなものが用いられます。

④ ReLUについて

・SoftmaxLossLayer(name="loss", bottoms=[:ip2,:label])

作った層を学習していくために、なんらかの基準を設ける必要があります。機械学習の分野ではこれを評価関数といいます。上の例では出力(予想値)とlabel(実際の値)とをみて、出来るだけ一致させたいという目的のもと、SoftmaxLossLayerを構築しています。

3. 初期設定、データのインストール

まずはgithubの以下のページからcloneしてください。前回のmnistをした人はこれは飛ばしてもらって大丈夫です。Mocha-documentation(https://github.com/pluskid/Mocha.jl

クローンしたらexmaples/cifar10よりフォルダに移動してもらって

でインストール完了です。

4. 用いたコードについて

以下で用いたコードを書いていきます。なお、エディタはJupyterを使用しました。

長いですが、層の設計をしています。入力はデータで、出力はラベルですね。それが正しいラベルと一致するように層を変化させていくことをしています。これにより、以下のようなネットワーク構造が出力できるとperfectです。(以下は出力なのでエディタに記入する必要はありません。)

次に計算していく上で必要な設定をしていきます。

これで細かな設定を行っています。主に、学習の仕方、更新の仕方、testデータの結果をどのくらいの反復で出力するかです。これについてはデフォルトのままでいいと思います。

学習の開始です。以下のように学習が進んでいくと思います。なお、僕のPCではこれを終えるのに2日程度かかりました。気長に待ちましょう。(なお下も計算結果です。)

ここまでで前半終了です。次からはこれを用いて、画像識別がうまくいっているかチェックしていくことにしましょう。