転移学習をしようとした際に、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についての理解を深めるためには、非常に重要な考え方でした。