こんなかんじ?
![](https://blogimg.goo.ne.jp/user_image/46/9b/9ceb4a687e93db60e8c4a72038779dfb.png)
このあと、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
のはじめの図、
![](https://blogimg.goo.ne.jp/user_image/78/2f/f6b6f41d0028238a3418238e1ca08707.png)
(上記サイトより引用)
の緑の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の図と上の図は、上下が逆)
![](https://blogimg.goo.ne.jp/user_image/46/9b/9ceb4a687e93db60e8c4a72038779dfb.png)
このあと、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
のはじめの図、
![](https://blogimg.goo.ne.jp/user_image/78/2f/f6b6f41d0028238a3418238e1ca08707.png)
(上記サイトより引用)
の緑の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の図と上の図は、上下が逆)