ウィリアムのいたずらの開発日記

ウィリアムのいたずらが、コンピューター関係について、思ったことを好き勝手に書いているブログです。

ディープラーニングのCNNとKerasを対応づけてみたーその1機械学習(8日追加)

2017-05-07 22:34:08 | Weblog
こんなかんじ?

このあと、model.fitする。そこで、エポック数など指定する

-----PythonのディープラーニングのライブラリKerasでのコードの説明-----

詳しく知らないので、ロリポおじさん程度の正確さで説明してみる。

【概要】

基本的には、中間層の構成

#畳み込み層
model.add(Convolution2D(32, 3, 3))
model.add(Activation("relu"))

#プーリング層
model.add(MaxPooling2D())
model.add(Dropout(0.5))

が続いている形になっている。これらについては、中間層で詳しく説明する。まずは順番に・・・


【入力層】

model = Sequential()

で、モデル領域を作成する。このmodelに付け足していく形

入力層も、まず、

  畳み込み(コンボリューション)層 Convolution2D
を追加した後
  活性化関数 Activation
を追加するが、

入力層の場合は、input_shapeというので、入力データのサイズ、チャネル数を指定する必要がある
(はじめにin_shape = (32, 32, 3)ととり、それを指定している)

【中間層】

●畳み込み層
定番のConvolutional Neural Networkをゼロから理解する
https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html


のはじめの図、


(上記サイトより引用)

の緑のConv層が畳み込み層でConvolution2Dで指定している。

model.add(Convolution2D(32, 2, 2))

のとき、32は、緑の層がいっぱいならんでいるけど、そこが32個あるということ

そのあとの2,2は、図の灰色の部分、2X2のフィルタ(Kerasのドキュメントでは畳み込みカーネル)の縦横を指定している。

一般的な画像処理だと、たとえば、画像加工するとき

-1 0 1
-1 0 1
-1 0 1

のようなテキトーな行列をかける、あの行列の縦横の大きさを指定している
(かける値wは、ディープラーニングで学習する)

これで行列処理した後(つまり、この行列が上記サイトのConvolution層の説明のΣwx+bの部分。
上の場合は3X3のフィルタといったが、実際にはRGBの3色あるので、27個の部分になるが、
以下めんどくさいので3X3で通す。)各値を活性化関数に通す

活性化関数は、Reluが流行っているんで、
model.add(Activation("relu"))
にしている。

●プーリング層
 たとえば、いまここで
1 2 という値があったとき
7 1

1の部分の影響は小さく、7の部分は大きくしたいんだけど、
このあとつながる部分によっては(左上の)1の影響も、大きくなってしまうかもしれない
そうすると、本来小さい影響しか与えないものが、大きな作用を生み出し、
結果が頑健でなくなる。そこで、小さい値しか影響しないものは、
この段階で切り捨てたい。

その作業をするのが、プーリング層。この場合、影響の大きい7を生かしたい。
このようなのが、MaxPoolingで、
model.add(MaxPooling2D())
を実行している。

さらに頑健にする為に、適当に連結をおとしているのが、Dropout

model.add(Dropout(0.5))

で、結合をさらに適当に落とすことで、頑健に(過学習しないように)している

【出力層】

出力層の最後は、
model.add(Dense(cls_num))
で、全結合する。ここでcls_num(クラス数)とは、最終的な判別結果は、何個(のクラス)にわけるか?を指定する
YES,Noなら2こ、赤、青、黄色なら3こということになる。
で、この活性化関数は、softmaxが使われる。

その1個前は、平坦化するため
model.add(Flatten())
している

【そのあと】

これで、モデルが出来たので
コンパイルして  model.compile
学習をさせるため model.fit を実行する
  このとき、nb_epochで、エポック数を指定する
  エポック数とは訓練データを回す回数のこと
で、結果確認を  model.evaluate
で行い、保存するときは
  model.to_json    でJSON形式になり
  model.save_weights で重みを保存できる


あわせて読みたい
CNNとRNNとLSTMを図示してみる
http://blog.goo.ne.jp/xmldtp/e/18e441801d90b3c4eba917654b45748c

(ここのCNNの図と上の図は、上下が逆)
ジャンル:
ウェブログ
この記事についてブログを書く
この記事をはてなブックマークに追加
« 「カーネルおじさん」のラブ... | トップ | グーグル出身者が設立し、ザ... »
最近の画像もっと見る

Weblog」カテゴリの最新記事

関連するみんなの記事