【keras】InceptionResNetV2の転移学習【犬猫判別5】

こんにちは、のっくんです。

今日はしばらく放置していた犬と猫の画像判別をやっていきたいと思います。

前回の記事ではVGG16のファインチューニングを頑張ってやっていました。

【Keras】転移学習とファインチューニング【犬猫判別4】

上記の記事ではバリデーション精度は94%でした。

今回は新しくInceptionResNetV2といういかにも強力そうなモデルを使って転移学習してみたら、97%まで精度が上がったのでその方法を記事にしたいと思います。

データ拡張

ここは毎度同じみのデータ拡張。

訓練データだけデータ拡張子して検証データは拡張しません。

train_datagen = ImageDataGenerator(rescale=1./255,
                                  rotation_range=40,
                                  width_shift_range=0.2,
                                  height_shift_range=0.2,
                                  shear_range=0.2,
                                  zoom_range=0.2,
                                  horizontal_flip=True,
                                  fill_mode='nearest')

validation_datagen = ImageDataGenerator(rescale=1./255)

使用するネットワーク

InceptionResNetV2をダウンロードして、全結合層を付け加えます。

最後の行で凍結させています。

conv_base = InceptionResNetV2(weights='imagenet', include_top=False, input_shape=(150,150,3))

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid')) 

conv_base.trainable = False

model.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=2e-5), metrics=['acc'])

ネットワークの内訳は以下の通り。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
inception_resnet_v2 (Model)  (None, 3, 3, 1536)        54336736  
_________________________________________________________________
flatten_1 (Flatten)          (None, 13824)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               3539200   
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 257       
=================================================================
Total params: 57,876,193
Trainable params: 3,539,457
Non-trainable params: 54,336,736
_________________________________________________________________

このモデル、5400万もパラメータがあります。

私が今までみた中で最大のパラメータ数です。

ジェネレータで学習させます。

history = model.fit_generator(
                            train_generator,
                            steps_per_epoch=train_generator.n//train_generator.batch_size,
                            epochs=20,
                            validation_data=validation_generator,
                            validation_steps=validation_generator.n//validation_generator.batch_size
                            )

いきなり1エポック目からいきなり高精度が出ています。

訓練とバリデーションでこんなにかけ離れてる学習結果は初めてみました。

なんという高精度。

最後にテスト画像を使って評価します。テストデータのジェネレータを評価する`evaluate_generator`を使います。

test_generator = validation_datagen.flow_from_directory(
        test_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test acc:', test_acc)
Found 1000 images belonging to 2 classes.
test acc: 0.9729999935626984

97%が出ました。

ファインチューニングや特徴量抽出など色々やり方はありますが、有望なモデルの転移学習の効果が1番大きいですね。

参考

https://towardsdatascience.com/transfer-learning-and-image-classification-using-keras-on-kaggle-kernels-c76d3b030649