今回はEfficientNetの実装方法についてまとめます。
1. EfficientNetの概要
EfficientNetとは2019年にGoogleが発表した画像分析モデルで、最強のモデルと言われています。画像分析ではモデルの大きさ(層の深さ、広さ)や画像の大きさが分析精度に大きく影響しますが、実際にはモデルを大きくしたり大きな画像を使おうとすると、あっという間にGPUメモリオーバーフローが発生します。そのため、限られたリソースの中でモデルや画像の大きさを調節する必要があります。
EfficientNetはモデルや画像の大きさのバランスをうまく調節したモデルで、リソースの大きさに合わせてスケールされた複数個のモデルが用意されています。EfficientNet_b0が一番小さくて、EfficientNet_b7が公開されている中では一番大きいです。以下の図はEfficientNetの論文から引用しているのですが、従来のモデルよりも少ないパラメータ数で高い精度を出していることが分かります。
ちなみに、b0~b7のモデルの大きさ(パラメータ数)や推奨される画像の大きさは以下の通りとのことです。(論文やサイトから引用)
※画像の大きさは上記の通りでなくても動きます。
2. EfficientNetの実装
早速実装に移りたいと思います。以下でEfficientNetを使用してファインチューニングできます。
!pip install -U git+https://github.com/qubvel/efficientnet from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, GlobalAveragePooling2D from tensorflow.keras import optimizers from efficientnet.tfkeras import EfficientNetB0 image_size = 224 input_shape=(image_size,image_size,3) def buildModel(): model = Sequential() model.add(EfficientNetB0( include_top=False, weights='imagenet', input_shape=input_shape)) model.add(GlobalAveragePooling2D()) model.add(Dense(num_classes, activation="softmax")) model.compile(optimizer=optimizers.Adam(learning_rate=1e-4), loss="categorical_crossentropy", metrics=["accuracy"]) return model model = buildModel()