機械学習の問題に適した事前トレーニング済みモデルを選択する方法

機械学習の問題に適した事前トレーニング済みモデルを選択する方法

[[264482]]

この記事では転移学習とは何か、どのように使用するのかを簡単に紹介します。

転移学習とは何ですか?

転移学習は、事前にトレーニングされたモデルを使用して深層学習の問題を解決する技術です。

転移学習は、事前にトレーニングされたニューラル ネットワークを使用して、ネットワークが元々解決するようにトレーニングされた問題に類似した問題を解決する機械学習手法です。たとえば、独自のモデルを構築する代わりに、犬の品種を識別するために構築されたディープラーニング モデルを活用して、犬と猫を分類することができます。これにより、効果的なニューラル ネットワーク アーキテクチャを見つける手間が省け、トレーニングに費やす時間が節約され、良好な結果が保証されます。つまり、猫と犬を正確に区別するために、長い時間をかけて 50 層の CNN を作成することもできますし、事前にトレーニングされた多数の画像分類モデルの 1 つを使用することもできます。

事前学習済みモデルを使用する3つの異なる方法

事前トレーニング済みモデルをリターゲットする方法は主に 3 つあります。彼らです、

  1. 特徴抽出。
  2. 事前トレーニング済みネットワークのアーキテクチャをコピーします。
  3. いくつかのレイヤーをフリーズし、他のレイヤーをトレーニングします。

特徴抽出:ここで必要なのは、出力層を変更して、元々コンテンツを分類するためにトレーニングされた数千のクラスではなく、猫と犬の確率 (またはモデルがコンテンツを分類しようとしているクラスの数) を与えることだけです。これは、モデルをトレーニングしようとしているデータが、事前トレーニング済みモデルが元々トレーニングされたデータと非常に類似しており、データセットのサイズが小さい場合に最適です。このメカニズムは固定特徴抽出と呼ばれます。追加した新しい出力層のみを再トレーニングし、各層の重みを保持します。

事前トレーニング済みネットワークのアーキテクチャをコピーする:ここでは、達成しようとしているタスクと同様のタスクを実行して優れた結果を示した事前トレーニング済みモデルと同じアーキテクチャを持つ機械学習モデルを定義し、それを最初からトレーニングします。事前トレーニング済みモデルから各レイヤーの重みを破棄し、データに基づいてモデル全体を再トレーニングします。トレーニングするデータが大量にあるが、事前トレーニング済みモデルがトレーニングされたデータとあまり類似していない場合に、このアプローチを採用します。

一部のレイヤーをフリーズし、他のレイヤーをトレーニングする:事前トレーニング済みモデルの最初の k レイヤーをフリーズし、上位の nk レイヤーのみをトレーニングすることを選択できます。初期値の重みを事前トレーニング済みモデルと同じに保ち、データ上で上位層を再トレーニングします。この方法は、データセットが小さく、データの類似性が低い場合に使用されます。下位層は、データから抽出できる最も基本的な情報に重点を置いており、基本レベルの情報は同じであることが多いため、他の問題にも使用できます。

もう 1 つの一般的な状況は、データの類似性が高く、データセットも大きい場合です。この場合、モデルのアーキテクチャとモデルの初期の重みは保持されます。次に、モデル全体を再トレーニングして、事前トレーニング済みモデルの重みを更新し、特定の問題により適合するようにします。これは転移学習を使用するのに理想的な状況です。

次の図は、データセットのサイズとデータの類似性が変化したときに使用される方法を示しています。

PyTorch での転移学習

PyTorch の torchvision.models モジュールには、事前トレーニング済みの 8 つの異なるモデルがあります。彼らです:

  1. アレックスネット
  2. VGGG
  3. RESNET
  4. スクイーズネット
  5. デンスネット
  6. インセプション v3
  7. グーグルネット
  8. シャッフルネット v2

これらはすべて、画像分類用に構築され、ImageNet データセットでトレーニングされた畳み込みニューラル ネットワークです。 ImageNet は、WordNet 階層に従って編成された画像データベースで、21,841 のカテゴリに属する​​ 14,197,122 枚の画像が含まれています。

PyTorch のすべての事前トレーニング済みモデルは同じタスクの同じデータセットでトレーニングされるため、どれを選択しても問題ありません。 ResNet ネットワークを選択し、前述したさまざまなシナリオでそれをどのように使用できるかを見てみましょう。

ResNet または画像認識のための深層残差学習には、PyTorch で ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152 の 5 つのバージョンがあります。

torchvisionからResNet-18をダウンロードしましょう。

  1. torchvision.models をモデルとしてインポートする
  2. モデル = models.resnet18(事前トレーニング済み=True)

以下は、先ほどダウンロードしたモデルです。

それでは、このモデルを 4 つの異なる問題でどのようにトレーニングできるか試してみましょう。

データセットは小さく、データの類似性は高い

この Kaggle データセット (https://www.kaggle.com/mriganksingh/cat-images-dataset) を検討してください。これには、猫の画像だけでなく、猫以外の画像も含まれます。 64×64×3ピクセルのトレーニング画像が209枚、テスト画像が50枚あります。これは明らかに非常に小さなデータセットですが、ResNet は多数の動物と猫の画像でトレーニングされていることがわかっているので、ResNet を固定特徴抽出器として使用して、猫と非猫の問題を解決できます。

  1. num_ftrs = モデル.fc.in_features
  2. 数値

アウト: 512

  1. モデル.fc.out_features

アウト: 1000

最後のレイヤーを除くすべてのネットワークをフリーズする必要があります。 backward() で勾配が計算されないように、パラメータを固定するには requires_grad = False を設定する必要があります。新しく構築されたモジュールのデフォルト パラメーターは requires_grad=True です。

  1. model.parameters() の paramの場合:
  2. param.requires_grad = False

最後のレイヤーでは、画像が猫であるかどうかの確率という 2 つの確率のみを提供する必要があるため、最後のレイヤーで出力機能の数を再定義できます。

  1. モデル.fc = nn.Linear(num_ftrs, 2 )

これが私たちのモデルの新しいアーキテクチャです。

今やるべきことは、モデルの最後のレイヤーをトレーニングすることだけです。そうすれば、リターゲットされた vgg16 を使用して、非常に少ないデータとトレーニング時間で、画像が猫であるかどうかを予測できるようになります。

データのサイズが小さく、データの類似性も低い

(https://www.kaggle.com/kvinicki/canine-coccidiosis) のデータセットを検討してください。このデータセットには、犬の腸に感染するコクシジウム寄生虫である Heterospora canis と Heterospora canis オーシストの画像とラベルが含まれています。これはザグレブの獣医学部によって作成されました。両方の寄生虫の画像が 341 枚含まれています。

このデータセットは小さく、Imagenet のカテゴリではありません。この場合、事前トレーニング済みのモデル アーキテクチャを維持し、下位層を固定してその重みを保持し、問題に合わせて重みを更新しながら下位層をトレーニングします。

  1. カウント = 0  
  2. model.children() 内の子の場合:
  3. カウント+= 1  
  4. 印刷(カウント)

アウト:10

ResNet18 には合計 10 層あります。最初の6層を冷凍しましょう。

  1. カウント = 0  
  2. model.children() 内の子の場合:
  3. カウント+= 1  
  4. カウント < 7 の場合:
  5. child.parameters() の paramの場合:
  6. param.requires_grad = False

最初の 6 つのレイヤーをフリーズしたので、最終出力レイヤーを再定義して、1000 ではなく 2 つの出力のみを生成するようにします。

  1. モデル.fc = nn.Linear(num_ftrs, 2 )

これは更新されたアーキテクチャです。

ここで、この機械学習モデルをトレーニングし、最後の 4 つのレイヤーの重みを更新します。

データセットのサイズは大きいが、データの類似性は非常に低い

KaggleのSkin Cancer MNISTデータセットHAM10000を検討してください。

7 つの異なるカテゴリに属する​​ 10015 枚以上の皮膚鏡画像があります。これは、Imagenet で見つけられる種類のデータではありません。

ここでは、モデル アーキテクチャのみが保持され、事前トレーニング済みモデルの重みは保持されません。出力層を再定義して、アイテムを 7 つのカテゴリに分類してみましょう。

  1. モデル.fc = nn.Linear(num_ftrs, 7 )

このモデルは、GPU のないマシンでトレーニングするには数時間かかりますが、十分なエポック数実行すれば、独自のモデル アーキテクチャを定義しなくても優れた結果が得られます。

データサイズが大きく、データの類似性が高い

Kaggle の花のデータセット (https://www.kaggle.com/alxmamaev/flowers-recognition) を検討してください。 4242枚の花の画像が含まれています。写真は、カモミール、チューリップ、バラ、ヒマワリ、タンポポの 5 つのカテゴリーに分かれています。各クラスには約800枚の写真があります。

これは転移学習を適用するのに理想的な状況です。事前トレーニング済みモデルの各レイヤーのアーキテクチャと重みを維持し、特定の問題に合わせて重みを更新しながらモデルをトレーニングしました。

  1. モデル.fc = nn.Linear(num_ftrs, 5 )
  2. best_model_wts = copy.deepcopy(model.state_dict())

事前トレーニング済みモデルから重みをコピーし、モデルを初期化します。これらの重みを更新するには、トレーニング フェーズとテスト フェーズを使用します。

  1. 範囲(num_epochs)内のエポックの場合:
  2.   
  3. print('エポック {}/{}'.format(epoch, num_epochs — 1 ))
  4. 印刷('-' * 10 )
  5. ['train', 'test']のフェーズの場合:
  6.   
  7. フェーズ == 'train'の場合:
  8. スケジューラ.ステップ()
  9. モデル.train()
  10. それ以外
  11. モデル評価()
  12. ランニングロス = 0.0  
  13. 実行中の修正 = 0  
  14. 入力の場合、データローダー[フェーズ]のラベル:
  15.   
  16. 入力 = inputs.to(デバイス)
  17. ラベル = labels.to(デバイス)
  18. オプティマイザ.zero_grad()
  19. torch.set_grad_enabled(phase == 'train') の場合:
  20.   
  21. 出力 = モデル(入力)
  22. _, preds = torch.max(出力, 1 )
  23. 損失 = 基準(出力、ラベル)
  24.   
  25. フェーズ == 'train'の場合:
  26. 損失.後方()
  27. オプティマイザ.ステップ()
  28. 実行損失 += loss.item() * 入力サイズ( 0 )
  29. running_corrects += torch.sum(preds == labels.data)
  30.   
  31. epoch_loss = running_loss / dataset_sizes[フェーズ]
  32. epoch_acc = running_corrects.double () / dataset_sizes[フェーズ]
  33. print('{} 損失: {:.4f} 加算: {:.4f}'.format(
  34. 位相、エポックロス、エポックアキュムレーション))
  35.   
  36. phase == 'test' かつ epoch_acc > best_accの場合:
  37. ベスト_acc = エポック_acc
  38. best_model_wts = copy.deepcopy(model.state_dict())
  39. print('ベスト val Acc: {:4f}'.format(best_acc))
  40. model.load_state_dict(ベストモデルwts)

この機械学習モデルもトレーニングに数時間かかりますが、たった 1 回のトレーニング エポックでも優れた結果が得られます。

同じ原則に従って、他のプラットフォーム上の他の事前トレーニング済みネットワークを使用して転移学習を実行できます。この記事では、Resnet と pytorch をランダムに選択しました。他の CNN でも同様の結果が得られます。これによって、コンピューター ビジョンを使用して現実世界の問題を解決する際の苦労が何時間も軽減されることを願っています。

<<:  顔認識技術は議論を呼んでいる。人工知能はどのように制御されるべきか?

>>:  人工知能を正しく実装するにはどうすればいいでしょうか?

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

人工知能があなたの好きな家を見つけるお手伝いをします

潜在的な購入者が住宅を閲覧したり、オンラインで検索したりする際に、エージェントやブローカーによる物件...

...

百度の張亜琴社長:AIは現代の最も変革的な力である

[[205882]]北京時間10月10日朝のニュースによると、中国の検索大手、百度はシアトル地域にオ...

...

Windows 11 AI「パーソナルアシスタント」、Microsoft Windows Copilot が近日登場

6月26日のニュースによると、今年5月、マイクロソフトは毎年恒例のBuild開発者会議で、Windo...

英国の反トラスト規制当局は、低性能のAIシステムの拡散を防ぐためのAI規制原則を策定した。

海外メディアの報道によると、9月19日、英国競争・市場庁(競争・市場庁)は、人工知能の規制当局や同技...

8月1日から顔認識技術に新たな解釈が加わり、違反は法的リスクに直面することになる

[[414411]]近年、顔認識技術は、身元認証からコミュニティのアクセス制御まで幅広く使用され、多...

10億件の速達配送のピークを迎える中、Baidu OCRが物流企業のスピードアップにどのように貢献しているかをご覧ください。

ダブル11の大割引が戻ってきました。新規のお客様が最初に購入できる厳選商品...速達便のビジネスプロ...

2022年の人工知能の7つのトレンド

近い将来に大きな価値を生み出す可能性のある技術の予測となると、人工知能は間違いなくリストのトップに位...

GPT ストアは来週開始され、OpenAI アプリケーションの爆発的な増加が目前に迫っています。最も完全なGPTビルダーユーザーガイドはここにあります

これから起こることは、やがて起こるでしょう! OpenAIが開発者会議で正式発表した「GPTストア」...

Gpts ストアの立ち上げが遅れています。適切な Gpts アプリケーションはどこで見つかりますか?

12月2日、OpenAIのChatGPTチームはGPT開発者に手紙を送り、「GPTストア」が202...

BATのアルゴリズムエンジニアにまた拒否された

[[186071]]今日、私は BAT のアルゴリズム エンジニアに再び拒否されました。はい、お読み...

機械学習モデルの導入における課題に対処する方法

[[377893]] [51CTO.com クイック翻訳] データとオープンソースの機械学習フレーム...

Linux 仮想化ガイド: 仮想化環境の構築

仮想化技術はコンピューティング分野で幅広い用途があり、ハードウェア リソースの利用率を向上させ、メン...

ChatGPT Plusの登録が停止、OpenAIは容量の課題に直面

11月16日、海外メディアの報道によると、OpenAIのCEOであるサム・アルトマン氏は最近、Dev...