こんにちは、のっくんです。
今日はしばらく放置していた犬と猫の画像判別をやっていきたいと思います。
前回の記事ではVGG16のファインチューニングを頑張ってやっていました。
上記の記事ではバリデーション精度は94%でした。
今回は新しくInceptionResNetV2といういかにも強力そうなモデルを使って転移学習してみたら、97%まで精度が上がったのでその方法を記事にしたいと思います。
[toc]
データ拡張
ここは毎度同じみのデータ拡張。
訓練データだけデータ拡張子して検証データは拡張しません。
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番大きいですね。