初心者必読!畳み込みニューラルネットワークの始め方

初心者必読!畳み込みニューラルネットワークの始め方

畳み込みニューラル ネットワークは、ディープ ニューラル ネットワークの中で非常に人気のあるネットワークと言えます。この記事では基礎から始め、畳み込みネットワークとその他の関連技術の基本原理を紹介し、畳み込みネットワークを使用して、参考例として簡単なプロジェクトを作成します。 CNNをゲットしたい友達は見逃さないでくださいね〜

[[267333]]

まず、次の写真を見てみましょう。

[[267334]]

画像ソース: Pix2PixHD

これは実際の写真ではありません。新しいウィンドウで開いて拡大するとモザイクが見られます。

実はこの写真はAIによって生成されたものなんです。すごくリアルに見えませんか?

Alex Krizhevsky 氏とその友人たちが ImageNet を通じてこの技術を発表してから、わずか 7 年が経ちました。 ImageNet は、アラスカン・マラミュートからトイレットペーパーの用途に至るまで、1,000 を超えるカテゴリを識別するために毎年開催される大規模な画像認識コンテストです。その後、彼らはAlexNetを作成し、ImageNetコンペティションで2位を大きく引き離して優勝しました。

この技術は畳み込みニューラルネットワークと呼ばれます。これは、特に画像に適したディープ ニューラル ネットワークの分野です。

画像出典: ImageNet

上のグラフは、ImageNet チャレンジで長年にわたり優勝したソフトウェアによって生成されたエラー率を示しています。 2016年にはエラー率が5%まで低下し、人間のレベルを超えたことがわかります。

ディープラーニングの導入は、ルールを変えるというよりも、ルールを破ることを意味します。

畳み込みニューラルネットワークアーキテクチャ

では、畳み込みニューラル ネットワークはどのように機能するのか、という疑問が生じます。

[[267335]]

畳み込みニューラル ネットワークが他のディープ ニューラル ネットワークよりも優れている理由は、その特殊な演算にあります。 CNN は、画像内の 1 つのピクセルを一度に計算するのではなく、複数のピクセルからの情報 (たとえば、上の図では 3 x 3 ピクセルが計算されています) を組み合わせて、時間的なパターンを理解できるようにします。

さらに、CNN はピクセルのグループが直線または曲線を形成することを「認識」できます。ディープ ニューラル ネットワークは通常、複数の畳み込み層で積み重ねられているため、前の層で直線または曲線を取得した後、次の層ではピクセルを結合するのではなく、線を図形に結合し、完全な画像が形成されるまで層ごとに処理を進めます。

Mynepalli の深層畳み込みニューラル ネットワークの画像

CNN を深く理解するには、カーネルとは何か、プーリング層とは何かなど、多くの基礎知識を学ぶ必要があります。しかし、今では優れたオープンソース プロジェクトが数多く存在し、それらに基づいて直接学習したり使用したりすることができます。

これにより、転移学習という別のテクノロジーが導入されます。

転移学習

転移学習では、トレーニング済みのディープラーニング モデルを使用して特定のタスクを学習します。

たとえば、電車の運行会社で働いている場合、人員を増やさずに電車が遅れるかどうかを予測したいとします。

2015 年の優勝者である ResNet などの畳み込みニューラル ネットワーク モデルを ImageNet で確実に使用できます。トレーニング画像を使用してネットワークを再トレーニングします。結果はきっと期待を裏切りません。

転移学習には主に 2 つの利点があります。

  • 最初からトレーニングする場合と比較すると、良好な結果を得るために必要な画像数はわずかです。 ImageNet コンテストでは、トレーニング用に 100 万枚の画像が提供されます。転移学習では、事前トレーニング済みのモデルが 100 万枚の画像でトレーニングされているため、優れたモデルをトレーニングするために必要な画像は 1,000 枚、あるいは 100 枚だけです。
  • トレーニング時間を短縮することで、優れたパフォーマンスを実現できます。 ImageNet モデルと同等のパフォーマンスを得るには、パフォーマンスが十分でない場合のモデルの微調整に必要な時間を含めず、数日間のトレーニングが必要になる場合があります。ただし、転移学習を使用すると、特定のタスクのトレーニングを完了するのに数時間または数分しかかからないため、時間を大幅に節約できます。

画像分類から画像生成まで

転移学習によって、多くの興味深いアイデアが生まれました。私たちは画像を処理してその中の情報を認識できるのだから、なぜ自分で画像を生成しないのでしょうか?

腹立たしいスティング!

生成的敵対ネットワークが誕生しました。

[[267336]]

Zhu Junyanらが提案したCycleGAN

この技術は、何らかの入力を与えると、対応する画像を生成できます。

上の図に示すように、CycleGAN は絵画に基づいて対応する実際の写真の生成、スケッチに基づいてバックパックの写真の生成、さらには超解像度再構成を行うことができます。

[[267337]]

超解像生成敵対ネットワーク

すごいですよね?

もちろん、これらのネットワークを構築する方法を学ぶこともできます。しかし、どうやって始めればいいのでしょうか?

畳み込みニューラルネットワークチュートリアル

まず、始めるのは簡単ですが、習得するのはそれほど簡単ではないことを知っておく必要があります。

まずは基本から始めましょう。

[[267338]]

画像出典: Thomas Verbruggen on Unsplash

空中サボテンの識別

これは Kaggle の学習プロジェクトです。あなたの課題は、航空写真に円柱状のサボテンがあるかどうかを識別することです。

とてもシンプルに見えますね。

Kaggle は 17,500 枚の画像を提供しており、そのうち 4,000 枚はテスト セットとしてラベル付けされていません。モデルが 4,000 枚の画像に正しくラベルを付けることができれば、満点のスコア 1、つまり 100% を獲得します。

長い間探していたのですが、ついに初心者に非常に適した次のプロジェクトを見つけました。

カクタス

この画像は上の画像と似ています。サイズは 32 x 32 で、円柱状のサボテンが含まれている場合と含まれていない場合があります。航空写真なので、様々な角度からの写真が収められています。

それで、何が必要ですか?

Python で畳み込みニューラル ネットワークを構築する

はい、ディープラーニングで最も人気のある言語は Python です。ディープラーニング フレームワークに関しては、多くの選択肢があり、1 つずつ試すことができます。

  • 最も人気のあるディープラーニング フレームワークである Tensorflow は、Google のエンジニアによって構築され、最も多くの貢献者とファンを抱えています。コミュニティが非常に大きいため、問題が発生したときに解決策を見つけるのは簡単です。高レベル API である keras は初心者の間で非常に人気があります。
  • 私のお気に入りのディープラーニングフレームワーク、Pytorch。これは純粋な Python で実装されているため、Python のすべての長所と短所を継承します。 Python 開発者は簡単に始めることができます。また、Keras が Tensorflow に対して行うような抽象化を提供する FastAI ライブラリもあります。
  • Apache によって開発されたディープラーニング フレームワークである MXNet。
  • Tensorflow の前身である Theano。
  • Microsoft が開発したディープラーニング フレームワーク、CNTK。

このチュートリアルでは、私のお気に入りの Pytorch と FastAI を使用します。

始める前に、Python をインストールする必要があります。 Python の公式 Web サイトにアクセスし、必要なバージョンをダウンロードします。必ずバージョン 3.6 以上を使用する必要があります。そうしないと、必要なライブラリの一部がサポートされなくなります。

次に、コマンド ラインまたはターミナルを開き、次のライブラリをインストールします。

  1. pip インストール numpy
  2. pip パンダをインストールする
  3. pip インストール jupyter

入力画像の保存には Numpy を使用し、CSV ファイルの処理には pandas を使用し、コーディングには Jupyter ノートブックを使用します。

次に、Pytorch の公式サイトにアクセスして必要なバージョンをダウンロードします。トレーニングを高速化したい場合は、CUDA バージョンの Pytorch をインストールします。バージョンは少なくとも 1.0 である必要があります。

上記を完了したら、torchvision と FastAI をインストールします。

  1. pip インストール torchvision
  2. pip インストール fastai

Jupyter ノートブック コマンドを実行して Jupyter を開くと、ブラウザ ウィンドウが開きます。

必要な環境が設定されたので、始めましょう。

データを準備する

必要なコードをインポートします。

  1. numpyをnpとしてインポートする
  2. pandasをpdとしてインポートする
  3. pathlibからPathをインポート
  4. fastai インポートから *
  5. fastai.vision からインポート *
  6. 輸入トーチ
  7. %matplotlib インライン

ほとんどすべてのタスクには Numpy と Pandas が必要です。 FastAI と Torch はディープラーニング ライブラリです。 Matplotlib Inline はグラフを表示するために使用されます。

Kaggleコンペティション公式サイトからデータをダウンロードできるようになりました。

zip ファイルを解凍し、Jupyter ノートブック フォルダーに配置します。

ノートブックの名前が Cacti であると仮定します。フォルダ構造は次のようになります。

Train フォルダーにはすべてのトレーニング イメージが含まれています。

テスト フォルダーは、送信されたテスト画像用です。

トレーニング CSV ドキュメントには、トレーニング データに関する情報が含まれており、画像名が列 has_cactus にマッピングされています。列に cactus が含まれている場合、値は 1 になり、含まれていない場合は 0 になります。

サンプル送信 CSV は送信に必要な形式になっています。ファイル名は、Test フォルダー内の画像に対応しています。

  1. train_df = pd .read_csv("train.csv")

トレーニング CSV ドキュメントをデータフレームに読み込みます。

  1. data_folder =パス(".")
  2. train_images = ImageList .from_df(train_df、パス= data_folder フォルダー= 'train' )

ImageList from_df メソッドを使用して読み込みジェネレーターを作成し、train_df データフレームを train フォルダー内の画像にマッピングします。

データ拡張

これは、既存のデータからさらに多くのデータを作成する手法です。猫の写真を水平に反転しても、それは猫の写真のままです。しかし、これを行うことで、データを 2 倍、4 倍、さらには 16 倍に増やすことができます。

データ量が少ない場合は、この方法を試すことができます。

  1. 変換= get_transforms ( do_flip = True flip_vert = True max_rotate = 10.0 max_zoom = 1.1 max_lighting = 0.2 max_warp = 0.2 p_affine = 0.75 p_lighting = 0.75 )

FastAI はこれを実行するための get_transform 関数を提供します。データを水平反転、垂直反転、回転、拡大、明るさ/輝度の増加、アフィン変換の適用などにより拡張できます。

上記で指定したパラメータを使用して、画像がどのように見えるか試すことができます。または、公式ドキュメントを詳しく読むこともできます。

次に、画像シーケンスに対して上記の前処理を実行します。

  1. train_img train_img = train_img.transform(変換、サイズ= 128 )

パラメータ サイズは、使用するニューラル ネットワークに合わせて入力を拡大または縮小するために使用されます。私が使用するネットワークは、ImageNet 2017 Best Paper Award の成果である DenseNet であり、入力画像サイズは 128*128 です。

トレーニングの準備

データの読み取り後、ディープラーニングで最も重要なステップであるトレーニングに進みます。このプロセスは、ディープラーニングにおける学習の起源でもあります。ネットワークはデータから学習し、データに対してより良い結果が得られるまで、学習した結果に基づいてパラメータを調整します。

  1. test_df = pd .read_csv("sample_submission.csv")
  2. test_img = ImageList .from_df(test_df、パス= data_folder フォルダー= 'test' )
  3. 列車画像 列車画像= 列車画像
  4. .split_by_rand_pct(0.01)
  5. .label_from_df()
  6. .add_test(テスト画像)
  7. .databunch(パス= '.' bs = 64 デバイス= torch .device('cuda:0'))
  8. .normalize(imagenet_stats)

トレーニング ステップでは、トレーニング データの小さな部分を検証セットに分割する必要があります。このデータは検証にのみ使用されるため、トレーニングには使用できません。畳み込みニューラル ネットワークが検証セットで良好なパフォーマンスを発揮すると、テスト セットでも良い結果が得られる可能性が高くなります。

FastAI は、上記の操作を簡単に実行できる split_by_rand_pct 関数を提供します。

databunch関数はバッチ処理を実行できます。 GPU メモリの制限により、バッチ サイズは 64 になります。 GPU がない場合は、デバイス パラメータを無視します。

その後、事前トレーニング済みのネットワークを使用しているため、正規化関数を使用して画像を正規化します。 imagenet_stats 関数は、ImageNet 事前トレーニング済みモデルのトレーニング方法に応じて入力画像を正規化します。

テスト データをトレーニング データ リストに追加すると、前処理を再度実行する必要がなくなり、後で予測が容易になります。これらの画像はトレーニングにも検証にも使用できないことに注意してください。これは、トレーニング画像とテスト画像がまったく同じ方法で前処理されることを保証するためです。

  1. 学習= cnn_learner (train_img、models.densenet161、メトリック=[エラー率、精度])

これでデータの準備は完了です。次に、cnn_leaner を使用してトレーナーを作成します。前述のように、事前トレーニング済みネットワークとして DenseNet を使用しましたが、TorchVision が提供する他のネットワークを選択することもできます。

シングルサイクルテクノロジー

これでトレーニングを開始できます。しかし、畳み込みニューラル ネットワークを含むディープラーニングのトレーニングにおける最大の課題の 1 つは、適切な学習率を選択する方法です。学習率は、勾配降下中にパラメータを更新することでエラーがどれだけ削減されるかを決定します。

[[267339]]

上の図に示すように、学習率が大きいほどトレーニング プロセスは速くなりますが、エラー境界を逃したり、制御可能な範囲から外れて収束に失敗する可能性が高くなります。ただし、わずかに小さい学習率を使用すると、トレーニング プロセスは遅くなりますが、発散は起こりません。

したがって、適切な学習率を選択することが非常に重要です。私たちが見つけたいのは、十分に大きいがトレーニングが発散しない学習率です。

しかし、言うのは簡単ですが、実行するのは難しいのです。

そこで、レスリー・スミスという男が単一期間戦略を考案しました。

簡単に言えば、まず複数の異なる学習率を力ずくで検索し、次に最小エラーに最も近いがまだ改善の余地がある学習率を選択します。コードは次のとおりです。

  1. 学ぶ.lr_find()
  2. 学習.レコーダー.プロット()

次のような出力が得られます。

最小誤差は 10^-1 なので、3*10^-2 など、この値よりわずかに小さい学習率を使用できます。

  1. r = 3e -02 です
  2. learn.fit_one_cycle(5, スライス(lr))

いくつかのエポック (ここでは 5 を選択しましたが、大きすぎず小さすぎず) をトレーニングしてから、結果を確認します。

ちょっと、何が起こっているの?

検証セットの精度は 100% に達しました。トレーニング プロセスは実際には非常に効率的で、わずか 6 分しかかかりませんでした。なんて幸​​運なのでしょう! 実際には、適切なアルゴリズムを見つけるには、数回の反復が必要になる場合があります。

提出するのが待ちきれません!ハハ。それでは、テスト セットの結果を予測して送信しましょう。

  1. preds, _ = learn .get_preds( ds_type = DatasetType .Test) test_df.has_cactus = preds .numpy()[:, 0]

テスト画像は以前にトレーニング画像リストに追加されているため、テスト画像を前処理する必要はありません。

  1. test_df.to_csv('submission.csv',インデックス= False )

上記のコード行は、4000 個のテスト画像の名前と、各画像にサボテンが含まれているかどうかのラベルを含む CSV ファイルを作成します。

提出しようとしたとき、以前は気づかなかったのですが、CSV を Kaggle カーネル経由で提出する必要があることがわかりました。

画像出典: Kaggle

幸いなことに、カーネル操作は Jupyter ノートブックと非常に似ています。作成した内容をノートブックにコピーして貼り付け、送信するだけです。

それでは、ドゥアン〜完了!

なんと!スコアは0.9999で、とても良いです。もちろん、最初の試みでこれほど良いスコアを取れたのであれば、改善の余地があるはずです。

そこで、ネットワーク構造を微調整して再度試してみました。

スコア1!できました!! あなたにもできますよ、実はそんなに難しくないんです。

(また、このランキングは4月13日時点のものなので、現在は順位が下がっているかもしれません…)

私が学んだこと

このプロジェクトはシンプルで、タスクを解決する際に奇妙な課題に遭遇することはないので、始めるのに最適です。

また、すでに満点を取った人も多いので、主催者は提出用のテストセットをもう 1 つ作成し、より難しいものにすべきだと思います。

とにかく、このプロジェクトを始めるのに基本的に難しいことはありません。すぐに試して高得点を獲得できます。

[[267340]]

画像ソース: Mario Mrad on Unsplash

畳み込みニューラル ネットワークは、画像認識から画像生成まで、さまざまなタスクに効果的です。画像の分析は以前ほど難しくありません。もちろん、努力すればできますよ。

したがって、適切な畳み込みニューラル ネットワーク プロジェクトを選択し、高品質のデータを準備して、開始してください。

オリジナルリンク:

https://medium.freecodecamp.org/everything-you-need-to-know-to-master-convolutional-neural-networks-ef98ca3c7655

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

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

<<:  オープンソース! Gartner の 100 ページの機械学習ブックが無料でダウンロードできるようになりました。

>>:  IDSにおける機械学習アルゴリズムの応用

ブログ    
ブログ    

推薦する

2024 年にソフトウェア開発の生産性を向上させる 10 のベスト AI ツール

2023年までに、AIは複数の業界で広く採用されるようになります。 2024 年までに、ソフトウェア...

...

スーパーコンピューターで設計された、カエルの細胞から作られた初の生きたロボット

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

最高裁判所は顔認識に関する司法解釈を発表し、無作為の「顔スキャン」に「ノー」と述べた。

今朝(8日)、第13期全国人民代表大会第5回会議第二回全体会議が開催され、最高人民法院と最高人民検察...

ソフトウェアテストが再び進化、Testinクラウドテストリモート実機サービスには明らかな利点がある

モバイルインターネット時代の始まり以来、スマートフォンへのソフトウェアの適応は常にソフトウェア業界の...

世界の主要なテクノロジー企業は新型コロナウイルスとどう戦っているのか?

[[319653]]新型コロナウイルスは、ウイルス自体の急速な拡散という点だけでなく、ますます多く...

...

クラウドネイティブの運用とメンテナンスを簡素化する方法

クラウド コンピューティングは、集中性、効率性、弾力性、ビジネスの俊敏性をもたらしましたが、クラウド...

DxRアルゴリズムのアイデアに基づいて設計されたルーティングアイテム配置構造の図

まず、タイトルには、検索構造ではなく、ルーティング項目の配置構造と書かれています。つまり、この構造を...

参入から放棄までのデータマイニング:線形回帰とロジスティック回帰

「データマイニングのアルゴリズムは、線形代数、確率論、情報理論に基づいています。それらを深く掘り下げ...

説明可能なAI: 4つの主要産業

[[267801]] AI システムがどのように意思決定を行うかを人々が理解できるようにする説明可能...

...

マッピングドローンは多くの「ファン」を獲得しており、これらの利点は刺激的です

近年、技術が成熟するにつれ、我が国の民間ドローン産業は急速な発展を遂げてきました。 「2019年中国...