VGG16とResNet50をベースモデルとして使う
keras.applications.VGG16(weights='imagenet', include_top=False)の使い方と、カスタムヘッドの追加について学習します。
「VGG16とResNet50をベースモデルとして使う」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
Keras Applicationsモジュール
tf.keras.applicationsには、1行でダウンロードできる事前学習済みアーキテクチャが数十種類含まれています。代表的な2つは、シンプルで3x3畳み込みを積み重ねたVGG16と、残差接続を使い、より深く高精度なResNet50です。
VGG16をベースモデルとして読み込む
ImageNetの重みを使ってVGG16を読み込みます。ただし分類ヘッドは読み込まず、独自のヘッドを追加できるようにします。
from tensorflow.keras.applications import VGG16
base = VGG16(
weights="imagenet", # download pretrained weights
include_top=False, # drop the 1000-class classifier
input_shape=(224, 224, 3) # standard ImageNet input size
)引数を理解する
weights="imagenet": ランダムな重みではなく、事前学習済みの重みを読み込みます。include_top=False: 元の全結合分類器を削除し、独自の分類器を追加できるようにします。input_shape=(224,224,3): 高さ、幅、3つのRGBチャンネルを指定します。
include_top=Falseを指定することで、モデルを新しいタスクに再利用できるようになります。
ベースモデルを凍結する
base.trainable = Falseを設定すると、最初の学習段階で事前学習済みの畳み込み重みが固定されます。学習するのは追加した新しいヘッドだけです。
base.trainable = False
print(len(base.trainable_weights)) # -> 0 when frozenGlobalAveragePooling2D
ベースモデルは(7, 7, 512)のような3次元の特徴マップを出力します。GlobalAveragePooling2Dは、空間グリッド上の各チャンネルを平均し、チャンネルごとに1つの値へとまとめます。この例では長さ512のベクトルになります。
巨大なFlattenとDenseの組み合わせを置き換えるため、パラメータ数を大幅に削減し、過学習も抑えられます。
from tensorflow.keras.layers import GlobalAveragePooling2D
# (batch, 7, 7, 512) -> (batch, 512)
pooled = GlobalAveragePooling2D()(base.output)Dense出力ヘッドを追加する
クラス数に合わせたサイズのDense層を追加します。マルチクラス分類にはsoftmaxを、二値分類にはsigmoidを使います。
from tensorflow.keras import layers, Model
x = base.output
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.3)(x)
outputs = layers.Dense(10, activation="softmax")(x)
model = Model(inputs=base.input, outputs=outputs)ResNet50に切り替える
ResNet50も同じAPIを使います。残差(スキップ)接続により、勾配消失を起こさずに、より深いネットワークを学習できます。通常、同程度の速度でVGG16より高いImageNet精度を得られます。
from tensorflow.keras.applications import ResNet50
base = ResNet50(
weights="imagenet",
include_top=False,
input_shape=(224, 224, 3)
)
base.trainable = FalseVGG16とResNet50の比較
- VGG16: 約1億3800万パラメータ、単純で均一な3x3畳み込みの積み重ね、大きなメモリ使用量、理解しやすい構造です。
- ResNet50: 約2500万パラメータ、残差ブロック、より深い構造で、通常は高精度かつ軽量です。
現代の転移学習タスクの多くでは、ResNet50がより有力なデフォルト選択です。
前処理を一致させる
各ファミリーには独自のpreprocess_inputがあります。VGG16はRGBの平均値を引きますが、ResNet50は似たCaffe形式のスケーリングを使います。必ずベースモデルに対応するものをインポートしてください。
from tensorflow.keras.applications.resnet50 import preprocess_input
x = preprocess_input(image_batch) # required for correct resultsモデルをコンパイルする
ベースモデルを凍結した状態で、通常のオプティマイザーを使ってヘッドをコンパイルし、学習します。
model.compile(
optimizer="adam",
loss="categorical_crossentropy",
metrics=["accuracy"]
)
model.fit(train_ds, validation_data=val_ds, epochs=10)アーキテクチャを確認する
model.summary()を呼び出し、ベースモデルが凍結されていること(Non-trainable paramsが大きいこと)と、ヘッドだけが学習可能であることを確認します。この動作確認により、設定ミスを早期に発見できます。
model.summary()
# Look at "Trainable params" vs "Non-trainable params"クイックチェック
Kerasで転移学習モデルを構築する方法について理解度を確認しましょう。
まとめ
weights="imagenet"、include_top=False、input_shape=(224,224,3)を指定してVGG16とResNet50を読み込み、base.trainable=Falseでベースモデルを凍結し、GlobalAveragePooling2Dで特徴をプーリングして、Dense出力ヘッドを追加しました。
ResNet50はより有力なデフォルト選択です。次は、層の凍結を解除してファインチューニングします。
よくある質問
「VGG16とResNet50をベースモデルとして使う」レッスンは無料ですか?
はい。「VGG16とResNet50をベースモデルとして使う」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「VGG16とResNet50をベースモデルとして使う」で何を学びますか?
keras.applications.VGG16(weights='imagenet', include_top=False)の使い方と、カスタムヘッドの追加について学習します。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「VGG16とResNet50をベースモデルとして使う」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 転移学習の概念と戦略
- VGG16とResNet50をベースモデルとして使う
- ファインチューニング:凍結解除と再学習
- エッジデプロイメント向けのMobileNetとEfficientNet