どうもニコイチです。今回のテーマは「転移学習あり」のモデルを使って画像の欠陥を検出する仕組みを作る方法です。前回までは「転移学習なし」で学習させたモデルの推論を試してみましたが、転移学習を導入するとどうなるのかを学んでいきましょう。
なぜ転移学習を使うのか
- 学習効率が上がる
大量の画像(ImageNetなど)であらかじめ学習させておくことで、画像の基本的な特徴(エッジや形など)を捉える力が身につきます。新しい画像を学習する際は、その「土台」を活かせるため、イチから学習するよりも早く精度が上がりやすいのです。 - データが少なくても効果あり
実務では、「たくさんの学習用データを集めるのが難しい」という場面も多いです。そうしたとき、すでに学習済みのモデルの重みをうまく活用することで、手持ちのデータが少なくても高い精度を目指せる可能性があります。 - 実務での導入がしやすい
大規模データを使ってモデルを最初から学習させるには、時間・計算資源・専門知識などが必要です。しかし転移学習なら、多くの場合は比較的少ないコストで性能の高いモデルを扱うことができます。
転移学習ありのモデルを作る流れ
- 元になる学習済みモデルを用意する
- ネットワークに接続できる環境なら、
pretrained=True
でモデルを自動取得。 - オフライン環境なら、USBなどで学習済みファイル(.pthファイル)を持ち込みロードする。
- ネットワークに接続できる環境なら、
- 最終層(分類層)を問題に合わせて付け替える
- 画像の欠陥分類なら、欠陥の種類数に合わせた出力層(全結合層)をつける。
- モデル全体 or 一部を再学習
- 一般的には全体を微調整(ファインチューニング)しますが、データ量や時間が限られているときは最終層だけ学習させることもあります。
コード例:オフライン環境での転移学習
実際のコード例を見てみましょう。ここではResNet18というモデルを用いて、外部ネットワークにつながらない環境でも学習済みパラメータをロードする方法を紹介します。
# ライブラリのインポート
import torch
import torch.nn as nn
from torchvision import datasets, models, transforms
# 定数設定
device = "cpu"
TARGET_NUM = 2 # 今回は2クラス分類
# モデル作成関数の定義
def get_model(target_num, isPretrained=False):
if(isPretrained):
model_ft = models.resnet18(pretrained=False)
# 事前学習済みのパラメータをロード
model_ft.load_state_dict(
torch.load('./resnet18-5c106cde.pth',
map_location=lambda storage, loc: storage),
strict=True
)
else:
model_ft = models.resnet18(pretrained=False)
# 出力層を欠陥検出向けに付け替え
model_ft.fc = nn.Linear(512, target_num)
model_ft = model_ft.to(device)
return model_ft
# 事前学習済みのResNet18モデルをインスタンス化
pretrained_model = get_model(target_num=2, isPretrained=True)
print(pretrained_model)
pretrained=False
で初期のモデル構造だけ作成load_state_dict(...)
を使って、オフライン環境でも.pth
ファイルから学習済み重みを読み込む- 最後に
model_ft.fc = nn.Linear(512, target_num)
で出力次元を2クラスに変更
転移学習の効果
下記のように学習ログを比較すると、転移学習を有効にしたモデルは学習開始直後から急速に損失(loss)が下がり、精度(accuracy)も高くなる傾向が見られます。
- 学習直後から高精度
- たとえば、10エポックに満たない段階で高い精度(98%前後)に達するケースもある
- 学習が安定しやすい
- 元々、ImageNetなどで学習済みなので、過度に学習が揺れにくい
身近な例え
たとえば、自転車の乗り方をもうマスターしている人(転移学習あり)なら、新しいタイプの自転車に乗るときもすぐに慣れてスイスイ走れます。一方、自転車に一度も乗ったことがない初心者(転移学習なし)だと、最初は転んだりして上達に時間がかかりますよね。すでに身につけている「バランス感覚」が活かせるかどうかが大きな差になります。
PoC(概念実証)でのメリット
実務では、いきなり最先端の技術を投入するのではなく、まずは「転移学習なし→あり」の順番で比較・検証することが多いです。
- 転移学習なしでの限界やデータ量の妥当性を確認する
- 転移学習ありに切り替えて、性能向上を体感する
この手順によって
- クライアントや上司に「なぜ転移学習が必要か」を納得してもらいやすい
- 学習プロセスを段階的に理解できる
- 期待値コントロールがしやすい
という利点があります。最終的にAI導入を成功させるために、少し回り道に見えるプロセスも大事です。
最後に:課題と確認テスト
課題1
オフライン環境でも事前学習済みモデルを使いたい場合の打開策として適切な選択肢はどれでしょうか?
- ImageNetの生データ(数GB〜)をHDDに移して再学習
- 学習済みResNetモデルをUSBなどに入れてパラメータをロード
- 転移学習自体をあきらめる
→ ヒント:ImageNetからイチから学習するのはコストが高すぎることが多い
回答
2. 学習済みResNetモデルをUSBなどを用い、オフライン環境下に持ってきてパラメータをロードする
理由
- ImageNetの生データは数GB以上と膨大かつ、高性能なGPUや学習時間が必要で、現実的ではありません。
- 転移学習を諦めるのはもったいないため、事前に学習済みの重みをUSBなどで持ち込むのがベストです。
課題2
転移学習を行う際、間違った記述はどれでしょうか?
- モデルに変更を加えたら、学習部分の関数も必ず修正が必要
- ResNet18をResNet34に切り替えるだけなら、修正は合計3箇所程度
- 学習前に事前学習済みの重みをロードする必要がある
→ ヒント:学習ロジックはほぼ変わらず、モデルの構造とロード部分の修正のみで対応
回答
2. 修正箇所3箇所で、ResNet18モデルでなく、ResNet34モデルを用いることができる
理由
- ResNet18からResNet34に変更する場合、たいていは
models.resnet18
の部分をmodels.resnet34
に書き換えるだけ(コード上で1箇所程度)で済むことがほとんどです。 - 学習部分の関数は構造変化に合わせて多少の確認が必要かもしれませんが、「3箇所」など大きく変わるわけではありません。
課題3
転移学習ありの学習ログを見た際に、誤っている記述を1つ選んでください。
- 転移学習ありは、学習開始直後でも高い精度を獲得しやすい
- 転移学習ありのモデルで約98.2%程度の精度が確認できた
- 100エポック学習するのが常にベストである
→ ヒント:転移学習では40エポック程度で収束してしまい、あまりに長く学習すると過学習(過度に覚えすぎ)を起こす
回答
3. 学習する場合のエポックは常に100に設定するのが適切である
理由
- 転移学習の場合、40エポック前後でほぼ収束するケースも多く、100エポックなど極端に長く回し続けると過学習を招きやすくなります。必ずしも100に固定すれば良いわけではありません。
まとめ
- 転移学習ありのモデルは、すでに学習された特徴を活用できるため、学習開始直後から損失が早く下がり、高い精度を獲得しやすい。
- オフライン環境でも、あらかじめダウンロードした学習済みパラメータ(.pthファイルなど)を持ち込めば、転移学習を使うことが可能。
- PoCでのステップとして、まずは転移学習なし→次に転移学習ありと段階を踏むことで、クライアントや上司の理解を得つつ効果を示しやすい。
- たとえ少しずつでも、こうした知識を積み上げることで必ず前進・成長していけると信じています。
次回(10. 転移学習ありのモデル精度改善)では、転移学習を用いてさらにモデルの精度を向上させる方法を考えていきます。
ここまで読んでいただきありがとうございました。
コメント