畳み込みニューラル ネットワークの設計を始めたいですか?これは包括的なデザインガイドです

畳み込みニューラル ネットワークの設計を始めたいですか?これは包括的なデザインガイドです

画像分類を始めたいが、どこから始めればよいか分からない。どの事前トレーニング済みネットワークを使用すればよいでしょうか? ニーズに合わせてネットワークを変更するにはどうすればよいでしょうか? ネットワークには 20 層と 100 層のどちらを含めるべきですか? 最も高速で正確なのはどれでしょうか? これらは、画像分類に最適な CNN を選択する際に直面する多くの質問です。

画像分類に CNN を選択する場合、最適化すべき非常に重要な指標が 3 つあります。精度、速度、メモリ消費です。これらのメトリックのパフォーマンスは、選択した CNN とそれに加えた変更によって異なります。異なるネットワーク (VGG、Inception、ResNet など) では、これらの指標に関して異なるトレードオフがあります。さらに、一部のレイヤーを削除したり、レイヤーを追加したり、ネットワーク内で拡張畳み込みを使用したり、さまざまなネットワーク トレーニング手法を使用したりすることで、これらのネットワーク構造を変更できます。

この記事は、特定の分類タスク用の CNN を設計するためのガイダンスを提供する設計ガイドとして役立ちます。特に、精度、速度、メモリ使用量という 3 つの主要な指標に焦点を当てます。さまざまな分類 CNN を研究し、これら 3 つのメトリックに関する特性を調べます。また、これらの基本的な CNN に対する可能な変更と、これらの変更がこれらのメトリックにどのように影響するかについても学習します。最後に、特定の画像分類タスクに対して CNN を最適に設計する方法を調査します。

ネットワークタイプ

ネットワーク タイプとこれら 3 つのメトリックの間には明確なトレードオフがあります。まず、Inception または ResNet タイプの設計を使用する必要があります。これらは VGGNet や AlexNet よりも新しいもので、速度と精度の間のトレードオフがより優れています (上の画像を参照)。スタンフォード大学の Justin Johnson 氏は、これらのいくつかをベンチマークする素晴らしい仕事をしました (https://github.com/jcjohnson/cnn-benchmarks)。

Inception と ResNet の選択は、実際には速度と精度のトレードオフです。精度が必要な場合は超深層 ResNet を使用し、速度が必要な場合は Inception を使用します。

巧妙な畳み込み設計を使用して実行時間とメモリ使用量を削減します

CNN の一般的な設計における最近の進歩により、精度をあまり損なうことなく CNN を高速化し、メモリ消費を削減できる非常に興味深い代替手段がいくつか生まれました。これらの方法はすべて、前述のどのタイプの畳み込みニューラル ネットワークにも簡単に統合できます。

  • MobileNets (https://arxiv.org/pdf/1801.04381​​.pdf) は、深さ方向に分離可能な畳み込みを使用して、達成したい計算の節約に応じて 1% ~ 5% の精度しか犠牲にせずに、計算とメモリの消費を大幅に削減します。
  • XNOR-Net (https://arxiv.org/pdf/1603.05279.pdf) はバイナリ畳み込みを使用します。つまり、畳み込み演算には 0 または 1 の 2 つの値のみが含まれます。この設計により、ネットワークは高いスパース性を持つことができ、メモリをあまり消費せずに簡単に圧縮できます。
  • ShuffleNet (https://arxiv.org/pdf/1707.01083.pdf) は、ポイント グループ畳み込みとチャネルのランダム化を使用して、MobileNet よりも高い精度を維持しながら計算コストを大幅に削減します。実際、従来の最先端の分類 CNN の精度を 10 倍以上の計算速度で達成できます。
  • ネットワーク プルーニング (https://arxiv.org/pdf/1605.06431.pdf) は、CNN の重みの一部を削除して、実行時間とメモリ消費を削減し、できれば精度を低下させない手法です。正確性を維持するために、削除された部分が最終結果に大きな影響を与えないようにする必要があります。リンク先の論文では、ResNet を使用してこれを簡単に実行する方法を示しています。

ネットワークの深さ

これは簡単です。一般的に、レイヤーを追加すると、速度とメモリを犠牲にして精度が向上します。しかし、私たちが気づいたのは、このトレードオフは限界効果の影響を受けるということです。つまり、レイヤーを追加すればするほど、追加するレイヤーごとに得られる精度の向上は小さくなります。

活性化関数

最近、活性化関数に関して多くの論争がありました。ただし、経験則としては、ReLU から始めるのが良いでしょう。 ReLU を使用すると、通常は開始してすぐに良い結果が得られます。 ELU、PReLU、LeakyReLU とは異なり、面倒な調整は必要ありません。設計が ReLU を使用して良好な結果を達成できることを確認したら、他の部分を調整し、そのパラメータを調整して、最終的な精度の向上を図ることができます。

畳み込みカーネルのサイズ

カーネル サイズを大きくすると、速度とメモリを犠牲にして常に最高の精度が得られると考えるかもしれません。ただし、これは常に当てはまるわけではありません。研究では、より大きな畳み込みカーネルを使用すると、ネットワークが発散しにくくなることが何度もわかっています。より小さいカーネル (例: 3×3) を使用する方が適切です。 ResNet と VGGNet はどちらもこの点を非常に包括的に示しています。これら 2 つの論文に示されているように、1×1 カーネルを使用して特徴の数を減らすこともできます。

膨張畳み込み

中心から遠いピクセルを使用するために、Dilated Convolution は畳み込みカーネルの重み間のスペースを使用します。これにより、ネットワークはパラメータの数を増やすことなく受容野を指数関数的に拡張することができ、メモリ消費量はまったく増加しません。拡張畳み込みは、わずかな速度のトレードオフでネットワークの精度を向上できることが示されています。

データ拡張

常にデータ拡張を行う必要があります。より多くのデータを使用すると、たとえデータが制限されている場合でも、パフォーマンスが継続的に向上することがわかっています。

(https://arxiv.org/pdf/1707.02968.pdf)。データ拡張により、より多くのデータを無料で入手できます。拡張機能のタイプはアプリケーションによって異なります。たとえば、自動運転車のアプリケーションを開発している場合、道路上に車、木、建物などが存在する可能性があるため、画像を垂直に反転しても意味がありません。ただし、天候の変化やシーンの変化により照明が変化することは避けられないため、照明を変更したり水平方向に反転したりしてデータを拡張することは理にかなっています。このデータ拡張ライブラリ (https://github.com/aleju/imgaug) をご覧ください。

トレーニングオプティマイザー

最終的にネットワークをトレーニングするときには、いくつかの最適化アルゴリズムから選択できます。多くの人が、精度の点では SGD が最良の結果をもたらすと言いますが、私の経験ではこれは正しいです。ただし、学習率の設定とパラメータを調整するのは面倒で困難です。一方、適応学習率 (Adam、Adagrad、Adadelta など) を使用するとより簡単かつ高速になりますが、SGD と同じ最適な精度が得られない可能性があります。

オプティマイザーをアクティベーション関数と同じ「スタイル」に従わせるのが最善です。まず最も単純なものを使用して、それが機能するかどうかを確認し、次により複雑なものを使用して調整および最適化します。個人的には、経験上最も使いやすい Adam から始めることをお勧めします。学習率をあまり高く設定せず、通常はデフォルトの 0.0001 に設定すると、非常に良い結果が得られます。その後、SGD を最初から使用することも、Adam から始めて SGD で微調整することもできます。実際、この記事では、Adam を使用して途中で SGD に切り替えると、最も簡単な方法で最高の精度を達成できることがわかりました。新聞に掲載されたこの写真を見てください。

カテゴリーバランス

特に実際のアプリケーションでは、不均衡なデータに遭遇するケースが多くあります。実際の簡単な例を見てみましょう。セキュリティ上の理由から、入力ビデオ内の人物が致死的な武器を持っているかどうかを予測するディープ ネットワークをトレーニングするとします。しかし、トレーニング データには、武器を持っている人のビデオが 50 本しかなく、武器を持っていない人のビデオが 1,000 本しかありません。このデータですぐにネットワークをトレーニングすると、モデルは間違いなく、誰かが武器を持っていないと予測する傾向が強くなります。

クラスの不均衡の問題を解決するには、次の方法を使用できます。

  • 損失関数でクラスの重みを使用します。基本的に、サンプルが不十分なクラスは損失関数でより高い重みを受け取るため、特定のクラスの誤分類により損失関数のエラーが大きくなります。
  • オーバーサンプリング: トレーニング サンプルに不十分なカテゴリを繰り返しサンプリングすると、サンプル分布のバランスをとるのに役立ちます。この方法は、利用できるデータが少ない場合に最適です。
  • ダウンサンプリング: 例が多すぎるクラスから、一部のトレーニング例を単純にスキップすることもできます。このアプローチは、大量のデータが利用できる場合に最適に機能します。
  • データ拡張: 少数カテゴリのデータに対してデータ拡張が実行されます。

転移学習の最適化

ほとんどのアプリケーションでは、ネットワークを最初からトレーニングするよりも、転移学習を使用する方が適切です。ただし、破棄するレイヤーと保持するレイヤーを選択する必要があります。これはデータに大きく依存します。データが、事前トレーニング済みのネットワーク (通常は ImageNet でトレーニング) で使用されるデータに類似しているほど、再トレーニングが必要なレイヤーの数は少なくなり、その逆も同様です。たとえば、画像にブドウが含まれているかどうかを分類するようにネットワークをトレーニングするとします。そのためには、ブドウが含まれている画像とブドウが含まれていない画像が大量に必要になります。これらの画像は ImageNet で使用される画像と非常に似ているため、最後のいくつかのレイヤー、おそらく完全に接続されたレイヤーだけを再トレーニングする必要があります。ただし、宇宙の画像に惑星が含まれているかどうかを分類する場合、データは ImageNet のデータとは大きく異なるため、後続の畳み込み層も再トレーニングする必要があります。つまり、次の原則に従う必要があります。

要約する

この記事では、画像分類アプリケーション用の CNN を設計するための包括的なガイドを示します。この記事を楽しんで読んでいただき、何か新しくて役に立つことを学んでいただければ幸いです。

オリジナルリンク:

https://hackernoon.com/a-comprehensive-design-guide-for-image-classification-cnns-46091260fb92

[この記事は51CTOコラム「Machine Heart」、WeChatパブリックアカウント「Machine Heart(id:almosthuman2014)」によるオリジナル翻訳です]

この著者の他の記事を読むにはここをクリックしてください

<<:  人工知能AIが創り出す素晴らしい「世界」を見に来てください

>>:  Microsoft AI の面接の質問はどれくらい難しいですか?サンプルロールはこちら

ブログ    
ブログ    
ブログ    

推薦する

Go 言語アルゴリズムの美しさ - 高度なソート

[[415242]]この記事はWeChatの公開アカウント「roseduanの執筆場所」から転載した...

...

...

産業用 AI チェックリスト: 始めるための 10 ステップ

人類はもはや人工知能(AI)の波から逃れることはできない。彼らが行くところすべてで、最新の AI ソ...

...

人工知能プログラミングは、人間がよりインテリジェントな機械を作成するのに役立ちますか?

テクノロジーが急速に進歩するにつれ、人工知能プログラミングはますます成熟しつつあります。その開発は、...

CPU、GPU、NPU、FPGA はディープラーニングでどのように優位性を発揮するのでしょうか?

AIの応用が広まるにつれ、ディープラーニングは現在のAI研究と応用の主流の方法となっています。膨大...

OpenAI主任科学者:ChatGPTはすでに意識を示しており、将来人間はAIと融合するだろう

昨夜、「ChatGPTはすでに意識を持っているかもしれない」という話題がWeiboで人気検索となった...

...

2021年に機械学習を学ぶには?この詳細なガイドがあなたをカバーします!

「すべての人にAI」の時代を迎え、多くの人が機械学習(ML)に何らかの形で触れるようになりました。...

...

...

...

Linux SNMP アルゴリズムと機能モジュール

Linux SNMP を十分に学習したい場合は、いくつかのモジュールに精通している必要があります。そ...

物流自動化への人工知能導入の大きな影響

自動化はテクノロジーを利用して、人間がより多くのタスクを完了できるようにします。物流の自動化をあらゆ...