Edited at

物体検出のモデルをCifar10でパラメータフィッティングできた。。。?!

More than 1 year has passed since last update.

昨日の結果を受けて、早速物体検出のモデルをCifar10の認識させてみました。

今回やったこと

①conv1-1からconv5-3までのモデルでCifar10物体認識を実施

②上記のパラメータを固定して、fc6からconv8-2までのパラメータをフィッティング

といっても、右往左往したのでそれなりに難易度は高めでした。

まず関連するコードは以下に置きます。

ある意味このコード見れば苦戦が見えると思います

PartiallySaveParams / Params4Buttai.py


①conv1-1からconv5-3までのモデルでCifar10物体認識を実施

これはほぼ予定通り、実施できました。

しかし、以下の工夫をしています。

①最初はBatchNormalizationとdropoutを入れる

 dropoutはパラメータに影響しませんが、BatchNormalizationは影響します。

 ただし、BatchNormalizationを外したモデルでも学習したパラメータは使えます。

 ということで、ほとんど苦労せずに収束しました。

②Cifar10の識別精度は88%程度でした

 つまり、これもVGG16ライクなモデルですが、このところ試行していた、モデルに比べるとちょっと低めです。しかも、accは98%以上まで伸びますが、val_accは88%ということで過学習になります。

その手前だと、86%程度がこのモデルの実力のようです。

※そういう意味では、物体検出でもこの部分は他のモデルで軽そうなものを使うべきだと考えています。少なくともResnetやWide_resnetを使う意味はありそうです。


上記のパラメータを固定して、fc6からconv8-2までのパラメータをフィッティング

これは、当初全くできませんでした。

中間層のパラメータは、

model.load_weights("block_1_1_009", by_name=True)

となっていますが、サイズを見るともともと全体のWeightsと同じ大きさです。

つまり、そのブロック用のテンソルだけ保存しているわけではなさそうです。

なんか間違っているような気もしていますが、。。。残念ながら不明

>>>当初記載の記事間違っていました。このweightファイルはすべてのLayerの重みを含んでいて、by_name=Trueをつけると同じ名前のLayer分はそこに反映するという意味のようです。つまり、当初の記事のようにたくさん保存する必要はないということです。

ということで、このパラメータは全体のモデルの入力や出力などに不整合があると適用できない作りになっていました。

今のモデルの場合、pool6はちょっと無理としても、その前のconv8-2のサイズを変更しています。本来はfilter*4のところをfilter*32としています。

conv8_2 = Conv2D(filter*32, (3, 3), name='conv8_2', padding='same', strides=(2, 2), activation='relu')(conv8_1) #4

一応、動いてしまったので、なーんだレベルですが、当初はすべての層でずれが出ていて、一個一個確認して、最後に上記の変更で通ることができました。

ちなみに、全体を素でフィッティングしようとするとこちらは全くLossが動きません。

ということで、こちらのLayerも一応フィッティングできました。


結果と課題

・今回はCifar10の大きなモデルでフィッティングできました。

・今回の方法は、逐次モデルの層を増やして効果を見る場合にも使えます。

①学習時はdropoutを入れる、そして実行時はdropoutをはずす

②上記は、load時by_name=trueで実現する

③部分的に他のモデルから採用したモデルは、前後の入出力パラメータを合わせる

・物体検出に応用するには、入力は(32,32,3)だし、num_classes=10なので、今後変更してフィッティングしないといけません。やはり、学習データの問題が大きそうです。

・物体検出モデルの最後の1/3の難易度がかなり高いです。ここの設計が一番問題になりそうですが、今回もスコープ外です^^;


今回フィッティングできたモデル全貌

物体検出のモデルとは、averagePooling2Dが異なりますが、ここはパラメータないので差し替えできます。

また、パラメータ固定部分のLayerから、当初入れていたBNやDropoutを外しています。

Layer (type)                 Output Shape              Param #

=================================================================
input_1 (InputLayer) (None, 32, 32, 3) 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 32, 32, 64) 1792
_________________________________________________________________
conv1_2 (Conv2D) (None, 32, 32, 64) 36928
_________________________________________________________________
pool1 (AveragePooling2D) (None, 16, 16, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 16, 16, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 16, 16, 128) 147584
_________________________________________________________________
pool2 (AveragePooling2D) (None, 8, 8, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 8, 8, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 8, 8, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 8, 8, 256) 590080
_________________________________________________________________
pool3 (AveragePooling2D) (None, 4, 4, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 4, 4, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
pool4 (AveragePooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
pool5 (AveragePooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
fc6 (Conv2D) (None, 2, 2, 1024) 4719616
_________________________________________________________________
drop6 (Dropout) (None, 2, 2, 1024) 0
_________________________________________________________________
fc7 (Conv2D) (None, 2, 2, 1024) 1049600
_________________________________________________________________
drop7 (Dropout) (None, 2, 2, 1024) 0
_________________________________________________________________
conv6_1 (Conv2D) (None, 2, 2, 512) 524800
_________________________________________________________________
conv6_2 (Conv2D) (None, 1, 1, 1024) 4719616
_________________________________________________________________
dropout_1 (Dropout) (None, 1, 1, 1024) 0
_________________________________________________________________
conv7_1 (Conv2D) (None, 1, 1, 256) 262400
_________________________________________________________________
conv7_1z (ZeroPadding2D) (None, 3, 3, 256) 0
_________________________________________________________________
conv7_2 (Conv2D) (None, 1, 1, 256) 590080
_________________________________________________________________
dropout_2 (Dropout) (None, 1, 1, 256) 0
_________________________________________________________________
conv8_1 (Conv2D) (None, 1, 1, 128) 32896
_________________________________________________________________
conv8_2 (Conv2D) (None, 1, 1, 2048) 2361344
_________________________________________________________________
dropout_3 (Dropout) (None, 1, 1, 2048) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_1 (Dense) (None, 512) 1049088
_________________________________________________________________
activation_1 (Activation) (None, 512) 0
_________________________________________________________________
dropout_4 (Dropout) (None, 512) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 5130
_________________________________________________________________
activation_2 (Activation) (None, 10) 0
=================================================================
Total params: 30,029,258
Trainable params: 15,314,570
Non-trainable params: 14,714,688
_________________________________________________________________

以下は、最初にフィッティングしたconv1-1からconv5-3のモデルです。

上記のパラメータで固定した部分です(Flatten部分の分だけずれてます)。

こちらは、Dropoutが前半にも入っています。

Layer (type)                 Output Shape              Param #

=================================================================
input_1 (InputLayer) (None, 32, 32, 3) 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 32, 32, 64) 1792
_________________________________________________________________
conv1_2 (Conv2D) (None, 32, 32, 64) 36928
_________________________________________________________________
dropout_1 (Dropout) (None, 32, 32, 64) 0
_________________________________________________________________
pool1 (AveragePooling2D) (None, 16, 16, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 16, 16, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 16, 16, 128) 147584
_________________________________________________________________
dropout_2 (Dropout) (None, 16, 16, 128) 0
_________________________________________________________________
pool2 (AveragePooling2D) (None, 8, 8, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 8, 8, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 8, 8, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 8, 8, 256) 590080
_________________________________________________________________
dropout_3 (Dropout) (None, 8, 8, 256) 0
_________________________________________________________________
pool3 (AveragePooling2D) (None, 4, 4, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 4, 4, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
dropout_4 (Dropout) (None, 4, 4, 512) 0
_________________________________________________________________
pool4 (AveragePooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 2, 2, 512) 2359808
_________________________________________________________________
dropout_5 (Dropout) (None, 2, 2, 512) 0
_________________________________________________________________
pool5 (AveragePooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_1 (Dense) (None, 512) 1049088
_________________________________________________________________
activation_1 (Activation) (None, 512) 0
_________________________________________________________________
dropout_6 (Dropout) (None, 512) 0
_________________________________________________________________
dense_2 (Dense) (None, 10) 5130
_________________________________________________________________
activation_2 (Activation) (None, 10) 0
=================================================================
Total params: 15,768,906
Trainable params: 15,768,906
Non-trainable params: 0
_________________________________________________________________