転移学習

学習に使う画像データが少ないとき、転移学習を使うと有効な場合がある。ただし、すべてのケースで転移学習が有効とは限らない。また、転移学習では、学習済みのモデル全体を再学習させたり、あるいは、学習済みモデルの最後のいくつかのレイヤーだけを再学習させたりすることが見られる。とくに後者の場合は、どのレイヤーから再学習させるかによって、予測性能が大きく異なってくる。

次のサンプルコードは、Kears を使った転移学習の例を示している。ここでは、学習済みのモデルである InceptionResNetV2 を使用して再学習させる。この際に、InceptionResNetV2 モデルの最後の 5 レイヤーだけを再学習させ、それよりも前のレイヤーは学習させないように固定している。学習後の予測性能が上がらない場合は、再学習させるレイヤーの数を調整することで予測性能が上がる場合がある。

import keras

n_classes = 20
input_tensor = keras.layers.Input(shape=(299, 299, 3))
    
base_model = keras.applications.inception_resnet_v2.InceptionResNetV2(include_top=False, weights='imagenet', input_tensor=input_tensor)
# base_model = keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
# base_model = keras.applications.inception_v3.InceptionV3(include_top=False, weights='imagenet', input_tensor=input_tensor)
        
# calculate number of layers in base model
n_layers_base_model = len(base_model.layers)
        
        
# build a top model
top_model = keras.models.Sequential()
top_model.add(keras.layers.Flatten(input_shape=base_model.output_shape[1:]))
top_model.add(keras.layers.Dense(516, activation='relu'))
top_model.add(keras.layers.Dropout(0.5))
top_model.add(keras.layers.Dense(n_classes, activation='softmax'))

       
# connect base_model and the top model
model = keras.models.Model(inputs=base_model.input, outputs=top_model(base_model.output))


# fix parameters in some layers of base model        
for layer in model.layers[:(n_layers_base_model - 5)]:
    layer.trainable = False
        
model.compile(loss='categorical_crossentropy',
              optimizer=keras.optimizers.SGD(lr=0.001, momentum=0.9, decay=1e-6, nesterov=True),
              metrics=['accuracy'])


print(model.summary())