こんにちは。
今回は以前作ったVGG16ベースで作った画像分類器をSequentialからFunctionalでモデルを作り直そうと思います。
以前作った画像分類器の記事はこちら。
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モデルで作成することができました。
次回はこちらで学習させて量子化した計量モデルを作っていこうと思います。