Kerasで複数のmodelを結合する方法

転移学習をしようとした際に、modelを結合するという、概念を知りました。
簡単ではありますが、modelを結合する方法について書いていきます。

Kerasでのmodel結合を考える際には、
functional APIの考えが参考になりました。

■functional APIでKerasを始めてみよう
https://keras.io/ja/getting-started/functional-api-guide/

functional APIでmodelを作成する手順は
・Inputを定義
・layerの記載
・Modelを定義

■functional APIでModelを作成

実際に記載してみましょう。
modelは、ただDenseを結合していくだけです。

#ライブラリをimport
from tensorflow import keras
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Dense, Dropout, Flatten, Input

#inputの定義
inputs = Input(shape=model.output_shape[1:])

#layerの記載
X = Dense(100, activation='relu')(inputs)
X = Dense(100, activation='relu')(X)
prediction = Dense(2,activation='softmax')(X)

#Modelの定義
modelvol2 = Model(inputs=inputs , outputs=prediction)

#Modelの確認
modelvol2.summary()

_________________________________________________________________
Layer (type) Output Shape Param # =================================================================
input_5 (InputLayer) [(None, 34, 34, 64)] 0 _________________________________________________________________ dense_11 (Dense) (None, 34, 34, 100) 6500 _________________________________________________________________ dense_12 (Dense) (None, 34, 34, 100) 10100 _________________________________________________________________ dense_13 (Dense) (None, 34, 34, 2) 202 =================================================================

■layerの記載に説明します。
layerインスタンス = layer内容( 結合するlayer )
という表記で作成していきます。

Sequential型であれば、
layer.add()で記載していく部分です。

■Modelの定義について説明します。
Model(inputs= XXX, outputs=YYY)で定義できます。
XXX・YYYにはlayerインスタンスを格納していきます。

predictionは最後の層です。が、
それまで継承してきた、Xも引き継いでいます。

・Layerの継承方法
・Modelの定義方法
が、modelを結合していく為に必要な考え方です。

modelを結合するために、もう一つmodelを作成します。

■Keras SequentialでModelを作成

modelvol1を作ります。
CNN型のmodel layerを並べました。

image_size = 150
modelvol1 = Sequential()
modelvol1.add(Conv2D(32,(3,3), activation='relu',input_shape=(image_size,image_size,3)))
modelvol1.add(MaxPooling2D(pool_size=(2,2)))
modelvol1.add(Conv2D(64,(3,3), activation='relu'))
modelvol1.add(MaxPooling2D(pool_size=(2,2)))
modelvol1.add(Dropout(0.25))

それでは、この2つのmodel を結合していきます。
結合していくときには、
・Layerの継承方法
・Modelの定義方法
を活用していきます。

新しく生成するmodelをmodelYとして作成していきます。

modelvol1 → modelvol2 の流れになるように結合していきます。

modelY = 
 Model(inputs=modelvol1.input , outputs=modelvol2(model.output))
modelY.summary()

_________________________________________________________________
Layer (type) Output Shape Param # =================================================================
conv2d_12_input (InputLayer) [(None, 150, 150, 3)] 0 _________________________________________________________________ conv2d_12 (Conv2D) (None, 148, 148, 32) 896 _________________________________________________________________ max_pooling2d_8 (MaxPooling2 (None, 74, 74, 32) 0 _________________________________________________________________ conv2d_13 (Conv2D) (None, 72, 72, 64) 18496 _________________________________________________________________ max_pooling2d_9 (MaxPooling2 (None, 36, 36, 64) 0 _________________________________________________________________ dropout_6 (Dropout) (None, 36, 36, 64) 0 _________________________________________________________________ model_10 (Model) (None, 36, 36, 2) 16802 =================================================================

これで、modelの結合は完了です。
>> model_10 (Model) (None, 36, 36, 2) 16802
の部分が、modelvol2で作成した部分です。

Model(inputs=modelvol1.input , outputs=modelvol2(model.output))

について少し解説します。
と、言っても、functional API部分の繰り返しになってしまいますが。

Modelの定義をしています。
( model結合と言っても、要は2つのmodelから、1つのmodelを生成している )

▼inputs
inputsは、modelvol1.inputの入力部分を

▼outputs
outputsは、modelのlayer部分を記載します。
実際に記載した内容は
modelvol2(model.output)です。
functional API部分でも記載した通り

layerインスタンス = layer内容( 結合するlayer )

というカタチで、継承していきます。
modelvol2(model.output)

これは、modelの最後部分に対して、modelvol2が継承するカタチになっています。
それがoutputsに入力されているのです。

これで、modelvol1 → modelvol2 の結合が完成しました。

functional APIでのmodelの作り方は、初めは避けていたのですが
転移学習を学んだり、modelについての理解を深めるためには、非常に重要な考え方でした。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です