こんにちは。
今回は以前作ったVGG16ベースで作った画像分類器をSequentialからFunctionalでモデルを作り直そうと思います。
以前作った画像分類器の記事はこちら。
aki-lab.hatenadiary.com
Sequential
前回はSequentialモデルでVGG16をベースとして前段にデータ拡張、後段に全結合層を追加していました。
具体的なコードはこんな感じ。
実際にモデルを確認してみます。
上記コードで作ったモデルに対して以下のように詳細を確認します。
model.summary()
以下のように表示されます。
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
rescaling (Rescaling) (None, 256, 256, 3) 0
random_rotation (RandomRota (None, 256, 256, 3) 0
tion)
random_zoom (RandomZoom) (None, 256, 256, 3) 0
random_flip (RandomFlip) (None, 256, 256, 3) 0
random_translation (RandomT (None, 256, 256, 3) 0
ranslation)
vgg16 (Functional) (None, None, None, 512) 14714688
flatten (Flatten) (None, 32768) 0
dense (Dense) (None, 512) 16777728
dropout (Dropout) (None, 512) 0
dense_1 (Dense) (None, 58) 29754
=================================================================
Total params: 31,522,170
Trainable params: 23,886,906
Non-trainable params: 7,635,264
_________________________________________________________________
Functional
次は同じモデルをFunctionalモデルで作成します。
作成コードはこちらです。
先ほどと同じようにモデルを確認します。
Model: "model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) [(None, 256, 256, 3)] 0
rescaling (Rescaling) (None, 256, 256, 3) 0
random_rotation (RandomRota (None, 256, 256, 3) 0
tion)
random_zoom (RandomZoom) (None, 256, 256, 3) 0
random_flip (RandomFlip) (None, 256, 256, 3) 0
random_translation (RandomT (None, 256, 256, 3) 0
ranslation)
block1_conv1 (Conv2D) (None, 256, 256, 64) 1792
block1_conv2 (Conv2D) (None, 256, 256, 64) 36928
block1_pool (MaxPooling2D) (None, 128, 128, 64) 0
block2_conv1 (Conv2D) (None, 128, 128, 128) 73856
block2_conv2 (Conv2D) (None, 128, 128, 128) 147584
block2_pool (MaxPooling2D) (None, 64, 64, 128) 0
block3_conv1 (Conv2D) (None, 64, 64, 256) 295168
block3_conv2 (Conv2D) (None, 64, 64, 256) 590080
block3_conv3 (Conv2D) (None, 64, 64, 256) 590080
block3_pool (MaxPooling2D) (None, 32, 32, 256) 0
block4_conv1 (Conv2D) (None, 32, 32, 512) 1180160
block4_conv2 (Conv2D) (None, 32, 32, 512) 2359808
block4_conv3 (Conv2D) (None, 32, 32, 512) 2359808
block4_pool (MaxPooling2D) (None, 16, 16, 512) 0
block5_conv1 (Conv2D) (None, 16, 16, 512) 2359808
block5_conv2 (Conv2D) (None, 16, 16, 512) 2359808
block5_conv3 (Conv2D) (None, 16, 16, 512) 2359808
block5_pool (MaxPooling2D) (None, 8, 8, 512) 0
flatten (Flatten) (None, 32768) 0
dense (Dense) (None, 512) 16777728
dropout (Dropout) (None, 512) 0
dense_1 (Dense) (None, 58) 29754
=================================================================
Total params: 31,522,170
Trainable params: 23,886,906
Non-trainable params: 7,635,264
_________________________________________________________________
VGG16モデルが展開されてしまっていますが、意図通り、Functionalモデルで作成することができました。
次回はこちらで学習させて量子化した計量モデルを作っていこうと思います。