導入 まず正直に言うと、しばらくの間、私はディープラーニングをあまり理解できませんでした。関連する研究論文や記事を調べてみたところ、ディープラーニングは信じられないほど複雑であるように思えました。ニューラル ネットワークとそのバリエーションを理解しようとしていますが、まだ苦労しています。 そしてある日、私は一歩ずつ進んで基礎から始めようと決心しました。私は、テクノロジーが実行する手順を分解し、その仕組みを理解するまで手順 (および計算) を手動で実行しました。時間がかかり、神経をすり減らしましたが、結果は驚くべきものでした。 今では、基礎がしっかりしているので、ディープラーニングについて総合的に理解しているだけでなく、それに基づいた優れたアイデアも持っています。ニューラル ネットワークを恣意的に適用することは 1 つの方法ですが、それが何であるか、およびその背後にあるメカニズムを理解することは別の方法です。 今日は、私の経験を皆さんと共有し、畳み込みニューラル ネットワークを始めて、最終的に理解するまでの過程を紹介します。 CNN の仕組みを深く理解していただけるよう、徹底したプレゼンテーションを行います。 この記事では、もともと画像認識と分類の問題を解決するために設計された CNN の背後にあるアーキテクチャについて説明します。また、ニューラル ネットワークに関する基本的な知識があることも前提とします。 目次1.機械はどのようにして画像を読み取るのですか? 2. ニューラル ネットワークが画像を認識できるようにするにはどうすればよいでしょうか? 3. 畳み込みニューラルネットワークの定義
4. まとめ 5. CNNを使用して画像を分類する 1. 機械はどのようにして画像を読み取るのでしょうか?人間の脳は、1秒間に複数の画像を見て(キャプチャして)、それを意識せずに処理できる非常に強力な機械です。しかし、機械の場合はそうではありません。機械が画像を処理する最初のステップは、画像をどのように表現するかを理解し、次に画像を読み取ることです。 簡単に言えば、各画像は特定の順序で並んだ一連のドット (ピクセル) です。ピクセルの順序や色を変更すると、画像が変わります。たとえば、数字の 4 が書かれた画像を保存して読み取ります。 基本的に、マシンは画像をピクセルのマトリックスに分割し、各ピクセルの位置を表すカラーコードを保存します。以下の表現では、値 1 は白、値 256 は最も暗い緑です (簡単にするために、例では 1 色に限定しています)。 画像情報をこの形式で保存したら、次のステップはニューラル ネットワークに順序とパターンを理解させることです。 2. ニューラル ネットワークが画像を認識できるようにするにはどうすればよいでしょうか?ピクセルを特徴付ける値は特定の方法で順序付けられます。 完全に接続されたネットワークを使用して画像を認識しようとすると、どうすればよいでしょうか? 完全に接続されたネットワークは、画像を平坦化して配列として扱い、ピクセル値を特徴として使用して画像内の値を予測することができます。はっきり言って、下の図で何が起こっているかをネットワークに理解させることは非常に困難です。 上の画像では数字の 4 が表されているということを人間でも理解するのは難しいでしょう。ピクセルの空間配置は完全に失われています。 私たちに何ができるでしょうか?空間配置が保持されるように、元の画像から特徴を抽出してみることができます。 ケース1ここでは、重みを使用して初期ピクセル値を乗算します。 これで、肉眼でこれが「4」であることを認識しやすくなりました。しかし、完全に接続されたネットワークに渡す前に、画像の空間配置を維持できるように平坦化する必要があります。 ケース2ここで、画像を平坦化すると画像の位置合わせが完全に崩れることがわかります。画像を平坦化せずにネットワークに送り込み、空間配置を維持する方法を見つける必要があります。つまり、ピクセル値の 2D/3D 配置をネットワークに送る必要があります。 画像のピクセル値を 1 つだけではなく 2 つ同時に取得してみることもできます。これにより、ネットワークは隣接するピクセルの特性について優れた洞察を得ることができます。一度に使用されるピクセルは 2 つなので、重み値も 2 つ同時に使用する必要があります。 グラフの値が 4 列から 3 列に変わったことにお気づきかと思います。一度に 2 つのピクセルをシフトするため (各シフト中にピクセルが共有される)、画像は小さくなります。画像が小さくなっても、これが「4」であることはほぼ分かります。また、重要な点は、連続する 2 つの水平ピクセルを取得するため、水平方向の配置のみが考慮されるということです。 これは画像から特徴を抽出する方法の 1 つです。左側と中央部分は見えますが、右側部分はそれほど鮮明ではありません。主な理由は次の 2 つの問題です。 1. 画像の左隅と右隅は、重みを 1 回乗算して取得されます。 2. 左側は重量値が高いため保持されますが、右側は重量がわずかに低いため、多少失われます。 現在、2 つの問題があり、2 つの解決策が必要です。 ケース3発生する問題は、重みが画像の左隅と右隅に対して 1 回だけ渡されることです。私たちがする必要があるのは、ネットワークが他のピクセルと同じようにコーナーを考慮できるようにすることです。これを修正する簡単な方法があります。重量移動の両側にゼロを配置します。 ゼロを追加することで、コーナーからの情報が再トレーニングされることがわかります。画像も大きくなります。これは、画像を縮小したくない場合に使用できます。 ケース4ここで解決しようとしている問題は、右隅の重み値が小さいためにピクセル値が低下し、認識が困難になっていることです。私たちにできることは、複数の重みの値を取得してそれらを組み合わせることです。 (1,0.3)の重み値から、次のような出力が得られる。 同時に、(0.1,5)形式の重み値も出力形式を提供します。 両方の画像を組み合わせると、鮮明な画像が得られます。そこで私たちが行うのは、1 つの重みではなく複数の重みを使用することで、画像に関するより多くの情報を再トレーニングすることです。最終結果は、上記の 2 つの画像を組み合わせたバージョンになります。 ケース5これまで、重みを使用して水平ピクセルを結合しようとしてきました。しかし、ほとんどの場合、水平方向と垂直方向の両方で空間レイアウトを維持する必要があります。ピクセルを水平方向と垂直方向に結合する重みの 2D マトリックスを取得します。もう一度、水平方向と垂直方向の重みの移動があったことを思い出してください。出力は水平方向と垂直方向に 1 ピクセル低くなります。 これらの画像を作成するきっかけを与えてくれた Jeremy Howard に特に感謝します。 それで私たちは何をしたのでしょうか?上記では、画像の空間配置を利用して画像から特徴を抽出しようとしました。画像を理解するためには、ネットワークがピクセルの配置を理解することが非常に重要です。上記で行ったことは、まさに畳み込みネットワークが行うことです。入力画像を取得し、重みマトリックスを定義し、入力を畳み込んで、空間配置に関する情報を失うことなく画像から特定の特徴を抽出できます。 この方法のもう一つの大きな利点は、画像パラメータの数が減ることです。ご覧のとおり、畳み込み画像は元の画像に比べてピクセル数が少なくなっています。 3. 畳み込みニューラルネットワークを定義する基本的な畳み込みネットワークを定義するには、次の 3 つの基本要素が必要です。 1. 畳み込み層 2. プーリング層(オプション) 3. 出力層 畳み込み層このレイヤーで実際に起こることは、上記の例 5 で見たものと同じです。 6×6 の画像があるとします。画像から特定の特徴を抽出するために重みマトリックスを定義します。 重みを 3*3 行列に初期化します。この重みは、すべてのピクセルが少なくとも 1 回カバーされ、畳み込み出力が生成されるように画像と結合される必要があります。上記の 429 は、重み行列と入力画像の 3*3 のハイライト部分の要素ごとの積の値を計算することによって得られます。 これで、6*6 の画像が 4*4 の画像に変換されます。重みマトリックスは、壁を塗装するときに使用するブラシのようなものだと想像してください。まずこのブラシで壁を水平方向に塗り、次に下に移動して次の列を水平方向に塗ります。重みマトリックスが画像に沿って移動すると、ピクセル値が再び使用されます。実際には、これにより、畳み込みニューラル ネットワーク間でパラメータを共有できるようになります。 以下に実際の画像を例に挙げます。 画像内の重みマトリックスは、元の画像マトリックスから特定の情報を抽出するフィルターのように機能します。ある重みの組み合わせはエッジ情報を抽出するために使用され、別の重みの組み合わせは特定の色を抽出するために使用され、別の重みの組み合わせは不要なノイズをぼかすために使用される場合があります。 最初に重みを学習し、次に多層パーセプトロン (MLP) と同様に損失関数を最小化できます。したがって、ネットワークが正しい予測を行えるように、パラメータを学習して元の画像から情報を抽出する必要があります。複数の畳み込み層がある場合、最初の層はより一般的な特徴を抽出する傾向があります。ネットワーク構造が深くなるにつれて、重み行列によって抽出される特徴はますます複雑になり、手元の問題にますます適用可能になります。 ストライドとパディングの概念上で見たように、フィルター、つまり重みマトリックスは、画像上で 1 ピクセルずつ移動します。これをハイパーパラメータとして定義して、画像内で重みマトリックスをどのように移動させるかを示すことができます。重み行列が一度に 1 ピクセルずつシフトされる場合、そのストライドは 1 であると言います。次に、ステップサイズが 2 の場合の状況を見てみましょう。 ストライド値を増やすと、画像のサイズが小さくなっていくことがわかります。入力画像の周囲にゼロの境界線を埋め込むことで、この問題を解決できます。ストライド値が高い画像の周囲に、ゼロ境界のレイヤーを複数追加することもできます。 画像にゼロパッド境界のレイヤーを追加した後、画像の元の形状がどのように保持されるかを確認できます。出力画像は入力画像と同じサイズなので、これを同一パディングと呼びます。 これは同じパディングです(つまり、入力画像の有効なピクセルのみを考慮します)。中央の 4 x 4 ピクセルは同一です。ここでは、境界線を使用することでより多くの情報を保持し、画像の元のサイズも保持しています。 複数のフィルターとアクティベーションマップ重みの深度次元は入力画像の深度次元と同じであることを覚えておくことが重要です。重みは入力画像の全深度まで拡張されます。したがって、単一の重み行列で畳み込むと、単一の深度次元を持つ畳み込み出力が生成されます。ほとんどの場合、単一のフィルター (重みマトリックス) を使用する代わりに、同じ次元の複数のフィルターが適用されます。 各フィルターの出力は積み重ねられ、畳み込み画像の深度次元を形成します。 32*32*3 の入力があるとします。有効なパディングを含む 5*5*3、10 個のフィルターを使用します。出力寸法は 28*28*10 になります。 次の図に示すように: アクティベーション マップは畳み込み層の出力です。 プーリング層画像が非常に大きいため、トレーニング可能なパラメータの数を減らす必要がある場合があり、そのためには後続の畳み込み層の間にプーリング層を定期的に導入する必要があります。プーリングの唯一の目的は、画像の空間サイズを縮小することです。プーリングは各深度次元で独立して行われるため、画像の深度は変更されません。プーリング層の最も一般的な形式は最大プーリングです。 ここでは、ストライドを 2 に、プーリング サイズを 2 に設定します。各畳み込み出力の深度次元に対しても最大化が強制されます。ご覧のとおり、最大プーリング操作の後、4*4 畳み込みの出力は 2*2 になります。 実際の画像で最大プーリングがどのように機能するかを見てみましょう。 ご覧のとおり、画像を畳み込み、最大プールしました。最大プール画像には、車が路上にあるという情報がまだ保持されています。よく見ると画像サイズが半分になっているのが分かります。これにより、パラメータの数を大幅に削減できます。 同様に、平均プーリングや L2 ノルム プーリングなど、他の形式のプーリングもシステムに適用できます。 出力寸法各畳み込み層の入力と出力のサイズを理解するのは少し難しいかもしれません。出力サイズの問題を理解するには、次の 3 つの点が役立ちます。出力ボリュームのサイズを制御するハイパーパラメータが 3 つあります。 1. フィルターの数 - 出力音量の深さはフィルターの数に比例します。各フィルターの出力がどのように積み重ねられてアクティベーション マップが形成されるかを覚えておいてください。アクティベーション マップの深さはフィルターの数に等しくなります。 2. ストライド - ストライドが 1 の場合、画像処理の精度は 1 ピクセル レベルになります。ストライドが大きいほど、同時に処理されるピクセル数が多くなり、出力ボリュームが小さくなります。 3. ゼロパディング - 入力画像の寸法を保持するのに役立ちます。単一のゼロパディングが追加された場合、単一ストライドフィルターの動きは元の画像サイズのままになります。 出力サイズを計算するには、簡単な数式を適用できます。出力画像の空間サイズは、([WF + 2P] / S) + 1 として計算できます。ここで、W は入力サイズ、F はフィルター サイズ、P はパディングの量、S はストライド数です。サイズが 32*32*3 の入力画像があり、シングル ストライドとゼロ パディングでサイズが 3*3*3 のフィルターを 10 個使用するとします。 すると、W=32、F=3、P=0、S=1となります。出力深度は適用されたフィルターの数(10)に等しく、出力サイズは([32-3+0]/1)+1 = 30です。したがって、出力サイズは 30*30*10 になります。 出力層複数層の畳み込みとパディングの後、クラスの形式で出力する必要があります。畳み込み層とプーリング層は、特徴のみを抽出し、元の画像によってもたらされるパラメータを削減します。ただし、最終的な出力を生成するには、完全に接続されたレイヤーを適用して、必要なクラスの数に等しい出力を生成する必要があります。畳み込み層だけに頼ってこの要件を達成するのは困難です。畳み込み層は 3D アクティベーション マップを生成できますが、必要なのは画像が特定のクラスに属しているかどうかなどの情報だけです。出力層には、予測誤差を計算するためのカテゴリクロスエントロピーに似た損失関数があります。順方向伝播が完了すると、誤差と損失を減らすために、逆方向伝播が開始され、重みとバイアスが更新されます。 4. まとめご覧のとおり、CNN はさまざまな畳み込み層とプーリング層で構成されています。ネットワーク全体がどのようになっているか見てみましょう。
5. KERAS での CNN を使用した画像分類猫と犬の写真を入力し、コンピューターに認識させて試してみましょう。これは画像認識と分類の古典的な問題であり、機械が画像を見て、猫と犬の異なる身体的特徴を理解する必要があります。これらの特徴は、図形の輪郭や猫のひげなどであり、畳み込み層がこれらの特徴を捉えます。データセットを試してみましょう。 以下の画像はデータセットからのものです。
まず、これらの画像が同じ形になるようにサイズを変更する必要があります。写真を撮るときにすべての画像を同じサイズにすることはほとんど不可能なので、画像を処理する前にこれを行うことがよくあります。 理解を簡単にするために、ここでは畳み込み層とプーリング層を 1 つずつだけ使用します。注: この単純な状況は、CNN のアプリケーション段階では発生しません。 #さまざまなパッケージをインポートする インポートOS numpyをnpとしてインポートする pandasをpdとしてインポートする scipyをインポートする sklearn をインポートする kerasをインポートする keras.modelsからSequentialをインポートする cv2をインポート skimage から io をインポート %matplotlib インライン #ファイルパスの定義 cat = os.listdir("/mnt/hdd/datasets/dogs_cats/train/cat") dog = os.listdir("/mnt/hdd/datasets/dogs_cats/train/dog") ファイルパス="/mnt/hdd/datasets/dogs_cats/train/cat/" ファイルパス2="/mnt/hdd/datasets/dogs_cats/train/dog/" #画像の読み込み 画像=[] ラベル = [] catのiの場合: イメージ = scipy.misc.imread(ファイルパス+i) images.append(画像) label.append(0) #猫の画像用 dogのiの場合: 画像 = scipy.misc.imread(ファイルパス2+i) images.append(画像) label.append(1) #犬の画像用 #すべての画像のサイズを変更する iが範囲(0,23000)内にある場合: 画像[i] = cv2.resize(画像[i],(300,300)) #画像を配列に変換する 画像 = np.array(画像) ラベル = np.array(ラベル) # ハイパーパラメータの定義 フィルター=10 フィルターサイズ=(5,5) エポック = 5 バッチサイズ=128 入力形状=(300,300,3) #ターゲット変数を必要なサイズに変換する keras.utils.np_utils から to_categorical をインポートします ラベル = to_categorical(ラベル) #モデルの定義 モデル = シーケンシャル() モデルを追加します(keras.layers.InputLayer(input_shape=input_shape)) model.add(keras.layers.convolutional.Conv2D(フィルター、フィルターサイズ、ストライド=(1, 1)、パディング='valid'、データフォーマット="channels_last"、アクティベーション='relu')) モデルを追加します(keras.layers.MaxPooling2D(pool_size=(2, 2))) モデルを追加します(keras.layers.Flatten()) モデルを追加します(keras.layers.Dense(units=2, input_dim=50, activation='softmax')) model.compile(損失='categorical_crossentropy'、オプティマイザー='adam'、メトリック=['accuracy']) model.fit(画像、ラベル、エポック=epochs、バッチサイズ=batchsize、検証分割=0.3) モデル.要約() このモデルでは、219,801 個のトレーニング可能なパラメータを持つ単一の畳み込みおよびプーリング層のみを使用しました。この場合に MLP を使用した場合、パラメータがいくつになるのか興味があります。畳み込み層とプーリング層を追加することで、パラメータの数をさらに減らすことができます。畳み込み層を追加すればするほど、抽出される特徴はより具体的かつ複雑になります。 このモデルでは、畳み込み層とプーリング層を 1 つだけ使用し、トレーニング可能なパラメータの数は 219,801 です。この場合に MLP を使用するとどれだけの効果が得られるかを知りたい場合は、畳み込み層とプーリング層を追加してパラメータの数を減らすことができます。畳み込み層が増えると、抽出される特徴がより具体的かつ複雑になります。 結論この記事が畳み込みニューラル ネットワークとは何かについて理解を深める助けになれば幸いです。この記事では、CNN の複雑な数学については説明しません。さらに詳しく知りたい場合は、独自の畳み込みニューラル ネットワークを構築して、その仕組みと予測の仕方を理解してみてください。 この記事はMachine Heartから転載したもので、原文はAnalyticsvidhyaから引用したもので、著者はDISHASHREE GUPTAです。 |
<<: 自動運転分野における機械学習アルゴリズムの応用に関する包括的なレビュー
>>: 人間の視覚的注意をシミュレートするリカレントニューラルネットワークを実装するにはどうすればよいでしょうか?
最近、OpenAI の主任科学者 Ilya Sutskever 氏が、計算理論の研究に重点を置く S...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
毎日生成されるデータの量は増加し続けています。その結果、これらの企業はこれまで以上に多くのデータを保...
今日の急速に変化するデジタル時代において、企業は効率を高め、運用コストを削減し、全体的な生産性を向上...
アメリカは顔認識技術と全面的に戦っている。米ニューヨーク州は最近、2022年まで学校での顔認識やその...
現在、AI の最大の可能性は、回帰や分類などの分析技術にあることが知られています。ニューラル ネット...
ChatGPT は、大きな新機能をリリースしようとしている可能性があります。つまり、過去のチャット...
[[344258]]業界をリードする組織を対象とした調査では、世界中の組織の大多数 (91.6%) ...
最近の急速な技術発展により、真のスマートシティの時代が近づいてきました。人工知能、クラウドおよびエッ...
機械学習モデルが現実世界でますます使用され、導入されるようになると、AI の意思決定は人々の日常生活...
Googleは6月15日、旅行計画、衣料品の買い物、皮膚異常の特定などをカバーする一連の新しい検索ア...