畳み込み層はディープラーニングニューラルネットワークでどのように機能しますか?

ツイート共有共有

最終更新日2020年4月17日

畳み込み層は、畳み込みニューラルネットワークで使用される主要な構成要素です。

畳み込みは、入力にフィルターを適用するだけで、アクティブ化されます。同じフィルターを入力に繰り返し適用すると、特徴マップと呼ばれるアクティベーションのマップが生成され、画像などの入力で検出された特徴の位置と強度が示されます。

畳み込みニューラルの革新ネットワークは、画像分類などの特定の予測モデリング問題の制約の下で、トレーニングデータセットに固有の多数のフィルターを並行して自動的に学習する機能です。その結果、入力画像のどこでも検出できる非常に特殊な機能が得られます。

このチュートリアルでは、畳み込みニューラルネットワークで畳み込みがどのように機能するかを説明します。

このチュートリアルを完了すると、

  • 畳み込みニューラルネットワークは、入力にフィルターを適用して、入力で検出された特徴の存在を要約する特徴マップを作成します。
  • フィルターは手作りできます。 、ライン検出器などですが、畳み込みニューラルネットワークの革新は、特定の予測問題のコンテキストでトレーニング中にフィルターを学習することです。
  • 1次元および2次元の畳み込みの特徴マップを計算する方法畳み込みニューラルネットワークのレイヤー。

ステップバイステップのチュートリアルとすべての例のPythonソースコードファイルを含む、私の新しい本「コンピュータービジョンのディープラーニング」でプロジェクトを開始します。

始めましょう。

穏やかディープラーニングニューラルネットワークの畳み込み層の概要
写真提供:mendhak、一部の権利は留保されています。

チュートリアルの概要

このチュートリアルは4つのパートに分かれています。それらは次のとおりです。

  1. 畳み込みニューラルネットワークでの畳み込み
  2. コンピュータービジョンでの畳み込み
  3. 学習したフィルターの能力
  4. 実例畳み込み層

コンピュータービジョンのディープラーニングで結果が必要ですか?

今すぐ無料の7日間の電子メールクラッシュコース(サンプルコード付き)。

クリックしてサインアップし、コースの無料のPDF電子ブックバージョンも入手してください。

無料のミニをダウンロード-コース

畳み込みニューラルネットワークでの畳み込み

畳み込みニューラルネットワーク(略してCNN)は2次元画像データを処理するために設計された特殊なタイプのニューラルネットワークモデルですが、1次元および3次元データで使用できます。

畳み込みニューラルネットワークの中心は、畳み込み層です。ネットワークにその名前を付けます。この層は「畳み込み」と呼ばれる演算を実行します。

畳み込みニューラルネットワークのコンテキストでは、畳み込みは、従来のように、重みのセットと入力の乗算を含む線形演算です。ニューラルネットワーク。この手法が2次元入力用に設計されている場合、乗算は、入力データの配列と、フィルターまたはカーネルと呼ばれる重みの2次元配列との間で実行されます。

フィルターは入力データと、入力のフィルターサイズのパッチとフィルターの間に適用される乗算のタイプは内積です。内積は、入力のフィルターサイズのパッチとフィルターの間の要素ごとの乗算であり、合計されて、常に単一の値になります。結果が単一の値になるため、この操作は「スカラー積」と呼ばれることがよくあります。

同じフィルター(重みのセット)を使用できるため、入力よりも小さいフィルターを使用することは意図的です。入力の異なるポイントで入力配列を複数回乗算します。具体的には、フィルターは、入力データの重複する各部分またはフィルターサイズのパッチに、左から右、上から下に体系的に適用されます。

画像全体に同じフィルターを体系的に適用することは、強力なアイデアです。 。フィルタが入力内の特定のタイプの特徴を検出するように設計されている場合、入力画像全体にそのフィルタを体系的に適用すると、フィルタは画像内の任意の場所でその特徴を検出する機会が得られます。この機能は、一般に並進不変性と呼ばれます。機能が存在していた場所ではなく、存在しているかどうかに関する一般的な関心。

ローカル翻訳への不変性は、もっと気にする場合に非常に便利なプロパティになります。ある機能が正確に存在する場所よりも存在するかどうか。たとえば、画像に顔が含まれているかどうかを判断する場合、ピクセル単位の精度で目の位置を知る必要はありません。顔の左側に目があり、右側に目があることを知る必要があります。顔の側面。

— 342ページ、ディープラーニング、2016年。

フィルターに入力配列を乗算した結果。 1回は単一の値です。フィルタが入力配列に複数回適用されると、結果は入力のフィルタリングを表す出力値の2次元配列になります。そのため、この操作からの2次元出力配列は「フィーチャマップ」と呼ばれます。

フィーチャマップが作成されると、フィーチャマップの各値を次のような非線形性を介して渡すことができます。 ReLUは、完全に接続されたレイヤーの出力の場合とほとんど同じです。

フィルターの例2次元入力に適用してフィーチャマップを作成する

デジタル信号処理分野または数学の関連分野から来た場合、行列の畳み込み演算を別のものとして理解できます。 。具体的には、入力に適用される前にフィルター(カーネル)が反転されます。技術的には、畳み込みニューラルネットワークの使用で説明されている畳み込みは、実際には「相互相関」です。それにもかかわらず、深層学習では、「畳み込み」操作と呼ばれます。

多くの機械学習ライブラリは相互相関を実装していますが、それを畳み込みと呼んでいます。

— 333ページ、Deep Learning、2016年。

要約すると、ピクセル値の画像などの入力があり、重みのセットであるフィルターがあり、フィルターが入力データに体系的に適用されて、特徴マップが作成されます。 。

コンピュータービジョンの畳み込み

画像データに畳み込み演算を適用するという考え方は、畳み込みニューラルネットワークにとって新しいものでもユニークなものでもありません。これはコンピュータビジョンで使用される一般的な手法です。

歴史的に、フィルタはコンピュータビジョンの専門家によって手作業で設計され、画像に適用されて特徴マップまたはフィルタの適用による出力が作成されました。何らかの方法で画像の分析が簡単になります。

たとえば、以下は垂直線を検出するための手作りの3×3要素フィルターです。

1
2
3

0.0、1.0、0.0
0.0、1.0、0.0
0.0、1.0、0.0

このフィルターを画像は、垂直線のみを含むフィーチャマップになります。これは垂直線検出器です。

これはフィルターの重み値から確認できます。中央の垂直線のピクセル値はすべて正にアクティブになり、両側のピクセル値はすべて負にアクティブになります。このフィルターを画像内のピクセル値全体に体系的にドラッグすると、垂直線のピクセルのみが強調表示されます。

水平線検出器を作成して、画像に適用することもできます。例:

1
2
3

0.0、0.0、0.0
1.0、1.0、1.0
0.0、0.0、0.0

両方のフィルターの結果を組み合わせる。両方の特徴マップを組み合わせると、画像内のすべての線が強調表示されます。

画像内の他の特徴を検出するために、数十または数百もの他の小さなフィルターのスイートを設計できます。

ニューラルネットワークで畳み込み演算を使用することの革新は、フィルターの値がネットワークのトレーニング中に学習される重みであるということです。

ネットワークは、どのタイプの特徴を学習するかを学習します。入力から抽出します。具体的には、確率的勾配降下法の下でのトレーニングでは、ネットワークは、解決するためにトレーニングされている特定のタスクの損失を最小限に抑える特徴を画像から抽出することを学習する必要があります。画像を犬または猫として分類するのに最も役立つ特徴を抽出します。

このコンテキストでは、これが強力なアイデアであることがわかります。

学習したフィルターの能力

機械学習タスクに固有の単一のフィルターを学習することは、強力な手法です。

しかし、畳み込みニューラルネットワークは実際にははるかに多くのことを実現します。 。

複数のフィルター

畳み込みニューラルネットワークは単一のフィルターを学習しません。実際、特定の入力に対して複数の特徴を並行して学習します。

たとえば、畳み込み層では、特定の入力に対して32〜512個のフィルターを並列に学習するのが一般的です。

これにより、モデル32、さらには512に、入力から特徴を抽出するさまざまな方法、または「見ることを学ぶ」方法とトレーニング後の入力データを「見る」方法のさまざまな方法が提供されます。

この多様性により、専門化が可能になります。線だけでなく、特定のトレーニングデータに見られる特定の線。

複数のチャネル

カラー画像には複数のチャネルがあり、通常は赤、緑、

データの観点からは、モデルへの入力として提供される1つの画像は、実際には3つの画像であることを意味します。

フィルターは常に同じ数である必要があります。入力としてのチャネルの数。「深度」と呼ばれることもあります。入力画像に3つのチャネル(たとえば、深さ3)がある場合、その画像に適用されるフィルターにも3つのチャネル(たとえば、深さ3)が必要です。この場合、3×3フィルターは、実際には3x3x3であるか、行、列、および深さに対して使用されます。入力の深さとフィルターの深さに関係なく、フィルターは内積演算を使用して入力に適用され、単一の値になります。

これは、畳み込み層に32個のフィルターがある場合、これらの32個のフィルターは、2次元画像入力用の2次元であるだけでなく、3次元でもあり、3つのチャネルのそれぞれに特定のフィルター重みがあります。ただし、各フィルターは単一のフィーチャマップになります。つまり、作成された32個の特徴マップに対して32個のフィルターを使用して畳み込み層を適用した場合の出力の深さは32です。

複数の層

畳み込み層は入力データにのみ適用されるわけではありません。 、例えば生のピクセル値ですが、他のレイヤーの出力にも適用できます。

畳み込みレイヤーを積み重ねることで、入力を階層的に分解できます。

動作するフィルターを検討してください。生のピクセル値に直接基づいて、線などの低レベルの特徴を抽出する方法を学習します。

最初の線レイヤーの出力を操作するフィルターは、低レベルの特徴の組み合わせである特徴を抽出する場合があります。形状を表現するために複数の線で構成される特徴など。

このプロセスは、非常に深い層が顔、動物、家などを抽出するまで続きます。

これはまさに私たちが見ているものです。実際には。ネットワークの深さが増すにつれて、機能が高次および高次に抽象化されます。

畳み込み層の実例

Keras深層学習ライブラリは、一連の畳み込み層を提供します。

工夫されたデータと手作りのフィルターを使用したいくつかの実例を見ると、畳み込み演算をよりよく理解できます。

このセクションでは、1次元の畳み込み層と畳み込み操作を具体的にし、Keras層の使用例を提供する2次元畳み込み層の例。

1D畳み込み層の例

1つを定義できます-値がすべて0.0の8つの要素があり、中央に値1.0の2つの要素のバンプがある次元入力。

1

1D畳み込み層の場合、Kerasへの入力は3次元である必要があります。

最初の次元は、各入力サンプルを参照します。この場合、サンプルは1つだけです。 2番目の次元は、各サンプルの長さを示します。この場合、長さは8です。 3番目の次元は、各サンプルのチャネル数を示します。この場合、チャネルは1つだけです。

したがって、入力配列の形状はになります。

1
2
3

#入力を定義data
data = asarray()
data = data.reshape(1、8、1)

入力サンプルの形状が期待されるモデルを定義します。

モデルには、次のような単一のフィルターがあります。 3つまたは3つの要素の幅の形状。 Kerasは、フィルターの形状をkernel_sizeと呼びます。

1
2
3

#create model
model = Sequential()
model.add(Conv1D(1、3、input_shape =(8、1)))

デフォルトでは、畳み込み層のフィルターが初期化されますランダムな重みで。この不自然な例では、単一のフィルターの重みを手動で指定します。入力例で定義したように、バンプを検出できるフィルター、つまり低い入力値に囲まれた高い入力値を定義します。

定義する3要素フィルターは次のようになります。

1

畳み込み層にもバイアス入力値があり、ゼロに設定する重みも必要です。

したがって、次のように、1次元畳み込み層の重みに手作りのフィルターを使用させることができます。

重みはで指定する必要があります。行、列、およびチャネルに関する3次元構造。フィルタには、1行、3列、1チャネルがあります。

重みを取得して、正しく設定されていることを確認できます。

1
2

#保存されたことを確認
print(model.get_weights())

最後に、入力データに単一のフィルターを適用できます。

これは、モデルでpredict()関数を呼び出すことで実現できます。これにより、フィーチャマップが直接返されます。これは、入力シーケンス全体に体系的にフィルターを適用した出力です。

1
2
3

#入力データにフィルターを適用
yhat = model.predict(data)
print(yhat )

これらすべてを結び付けると、完全な例は次のようになります。以下にリストされています。

例を実行すると、最初にネットワークの重みが出力されます。これは、手作りのフィルターがモデルに期待どおりに設定されたことの確認です。

次に、フィルターが入力パターンに適用され、特徴マップが計算されて表示されます。フィーチャマップの値から、バンプが正しく検出されたことがわかります。

1
2
3
4
5
6
7
8
9
10

]、
]、
]]、dtype = float32)、array(、dtype = float32)]
]]

ここで何が起こったのかを詳しく見てみましょう。

入力は値を持つ8要素ベクトル:。

最初に、3要素フィルターがinの最初の3つの入力に適用されました。内積( “。”演算子)を計算して配置すると、フィーチャマップにゼロの単一の出力値が生成されます。

1
2

from numpy import asarray
print(asarray()。dot(asarray()))

手動の例では、これは次のとおりです。

1

。 = 0

次に、フィルターを次の1つの要素に沿って移動しました。入力シーケンスとプロセスが繰り返されました。具体的には、同じフィルターがインデックス1、2、および3の入力シーケンスに適用されたため、フィーチャマップの出力もゼロになりました。

1

。 = 0

体系的であるため、ここでもフィルタは、入力のもう1つの要素に沿って移動され、インデックス2、3、および4の入力に適用されます。今回の出力は、フィーチャマップの1の値です。機能を検出し、適切にアクティブ化しました。

1

。 = 1

全体を計算するまで、このプロセスが繰り返されます機能マップ。

1

フィーチャマップには6つの要素がありますが、入力には8つの要素があることに注意してください。これは、フィルターが入力シーケンスにどのように適用されたかのアーティファクトです。パディングなど、結果のフィーチャマップの形状を変更する入力シーケンスにフィルターを適用する方法は他にもありますが、この投稿ではこれらの方法については説明しません。

異なる方法でそれを想像できます。入力の場合、入力シーケンス内のさまざまな特徴を検出するために、強度が多かれ少なかれ、フィルター内の重みが異なる特徴を検出できます。

2D畳み込みレイヤーの例

前のセクションのバンプ検出の例を、2次元画像の垂直線検出器に拡張できます。

、入力を制限できます。この場合は、中央に1本の垂直線がある単一チャネル(グレースケールなど)の正方形の8×8ピクセルの入力画像に制限できます。

1
2
3
4
5
6
7
8

Conv2Dレイヤーへの入力は4次元である必要があります。

最初の次元はサンプルを定義します。この場合、サンプルは1つだけです。 2番目の次元は行数を定義します。この場合、8つです。 3番目の次元は、列の数(この場合は8つ)、最後にチャネルの数(この場合は1つ)を定義します。

したがって、入力は4次元の形状である必要があります。

Conv1Dの例で前のセクションで行ったように、単一のフィルターでConv2Dを定義します。

フィルターは2次元で、形状3の正方形になります。 ×3。レイヤーは、入力サンプルの形状またはを想定します。

1
2
3

#create model
model = Sequential()
model.add(Conv2D(1、(3,3)、input_shape =(8、 8、1)))

垂直線を定義します入力データ内の単一の垂直線を検出するための線検出器フィルター。

フィルターは次のようになります。

1
2
3

0、1、0
0、1、0
0、1、0

これは次のように実装できます。

最後に、入力画像にフィルターを適用すると、入力画像の垂直線の検出を示すと予想される特徴マップが作成されます。

1
2
#入力データにフィルターを適用する
yhat = model.predict(data)

フィーチャマップ出力の形状は、形状が4次元になります。単一のバッチを実行し、単一のフィルター(1つのフィルターと1つの入力チャネル)があるため、出力形状はです。次のように、単一のフィーチャマップのコンテンツをきれいに印刷できます。

1
2
3

for r in range(yhat.shape):
#行の各列を出力します
print(for c in range( yhat.shape)])

これらすべてを結び付ける、完全な例を以下に示します。

最初に例を実行すると、手作りのフィルターがレイヤーの重みで正しく定義されていることが確認されます。

次に、計算された特徴マップが印刷されます。数値のスケールから、実際にフィルターが特徴マップの中央で強いアクティブ化を伴う単一の垂直線を検出したことがわかります。

計算されたものを詳しく見てみましょう。

最初に、フィルターを画像の左上隅、または3×3要素の画像パッチに適用しました。技術的には、画像パッチは単一チャネルの3次元であり、フィルターは同じ次元です。 dot()関数を使用してNumPyでこれを実装することはできません。代わりに、tensordot()関数を使用して、すべての次元を適切に合計できるようにする必要があります。たとえば、次のようになります。 0.0の場合、たとえば、特徴は検出されませんでした。これにより、フィーチャマップの左上隅に最初の要素が表示されます。

手動では、次のようになります。

1
2
3

0、1、0 0、0、0
0、1、 0。 0、0、0 = 0
0、1、0 0、0、0

フィルターを1列左に移動し、プロセスを繰り返します。この場合も、機能は検出されません。

1
2
3

0、1、0 0、0、1
0、1、0。 0、0、1 = 0
0、1、0 0、0、1

もう1つ左に移動して次の列に移動すると、機能が初めて検出され、強力なアクティブ化が行われます。

1
2
3

0、1、0 0、1、1
0、1、0。 0、1、1 = 3
0、1、0 0、1、1

このプロセスは、フィルターのエッジが入力画像のエッジまたは最終列に当たるまで繰り返されます。これにより、機能マップの最初の完全な行の最後の要素が得られます。

1

次に、フィルターは1行下に移動し、最初の列に戻ります。プロセスは左から右に関連付けられ、機能マップの2行目になります。そして、フィルターの下部が入力画像の下部または最後の行に載るまで続けます。

ここでも、前のセクションと同様に、特徴マップが6×6の行列であり、小さいことがわかります。入力画像へのフィルターの適用方法に制限があるため、8×8入力画像よりも優れています。

参考資料

このセクションでは、このトピックに関するより多くのリソースを提供します。

投稿

  • 機械学習のための畳み込みニューラルネットワークのクラッシュコース

  • 第9章:畳み込みネットワーク、ディープラーニング、2016年。
  • 第5章:コンピュータービジョンのディープラーニング、Pythonを使用したディープラーニング、2017年。

API

  • Keras Convolutional Layers API
  • numpy.asarray API

概要

このチュートリアルでは、次のことを発見しました。畳み込みニューラルネットワークで畳み込みがどのように機能するか。

具体的には、次のことを学びました。

  • 畳み込みニューラルネットワークは入力にフィルターを適用します入力で検出された特徴の存在を要約する特徴マップを作成します。
  • フィルターはライン検出器などの手作りが可能ですが、畳み込みニューラルネットワークの革新は、特定の予測問題のコンテキストでトレーニング中にフィルターを学習することです。
  • 計算方法畳み込みニューラルネットワークの1次元および2次元畳み込み層の機能マップ。

質問がありますか?
以下のコメントで質問してください。答えるのが最善です。

今日のビジョンのディープラーニングモデルを開発してください!

数分で独自のビジョンモデルを開発する

…数行のPythonコードで

方法を見つける私の新しい電子ブック:
コンピュータービジョンのディープラーニング

次のようなトピックに関する自習チュートリアルを提供します:
分類、オブジェクト検出(yoloおよびrcnn)、顔認識(vggfaceおよびfacenet) 、データの準備など…

最終的にビジョンプロジェクトにディープラーニングをもたらします

アカデミックをスキップします。結果だけ。

中身を見る

ツイート共有共有

Leave a Reply

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です