よっしーの私的空間

機械学習を中心に興味のあることについて更新します

TensorflowによるEfficientNetの実装

今回はEfficientNetの実装方法についてまとめます。

1. EfficientNetの概要

EfficientNetとは2019年にGoogleが発表した画像分析モデルで、最強のモデルと言われています。画像分析ではモデルの大きさ(層の深さ、広さ)や画像の大きさが分析精度に大きく影響しますが、実際にはモデルを大きくしたり大きな画像を使おうとすると、あっという間にGPUメモリオーバーフローが発生します。そのため、限られたリソースの中でモデルや画像の大きさを調節する必要があります。
EfficientNetはモデルや画像の大きさのバランスをうまく調節したモデルで、リソースの大きさに合わせてスケールされた複数個のモデルが用意されています。EfficientNet_b0が一番小さくて、EfficientNet_b7が公開されている中では一番大きいです。以下の図はEfficientNetの論文から引用しているのですが、従来のモデルよりも少ないパラメータ数で高い精度を出していることが分かります。
f:id:t-yoshi-book:20210325013412p:plain

ちなみに、b0~b7のモデルの大きさ(パラメータ数)や推奨される画像の大きさは以下の通りとのことです。(論文サイトから引用)
f:id:t-yoshi-book:20210325015118p:plain
※画像の大きさは上記の通りでなくても動きます。

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()