CS231n視覚認識のための畳み込みニューラルネットワーク から畳み込みニューラルネットワークを見ていました。畳み込みニューラルネットワークでは、ニューロンは3次元(height
、width
、depth
)に配置されます。 CNNのdepth
に問題があります。私はそれが何であるかを視覚化することはできません。
リンクでは、彼らはThe CONV layer's parameters consist of a set of learnable filters. Every filter is small spatially (along width and height), but extends through the full depth of the input volume
と言った。
たとえば、この写真をご覧ください。画像が安っぽい場合は申し訳ありません。
画像から小さな領域を取り除いて、それを「フィルター」と比較するという考えを理解できます。フィルターは小さな画像のコレクションになりますか?また、彼らは_We will connect each neuron to only a local region of the input volume. The spatial extent of this connectivity is a hyperparameter called the receptive field of the neuron.
_と言ったので、受容フィールドはフィルターと同じ次元を持っていますか?また、ここの深さはどうなりますか?そして、CNNの深さを使用して何を意味しますか?
だから、私の質問は主に、_[32*32*3]
_の次元の画像を取得する場合(これらの画像を50000個持って、データセット_[50000*32*32*3]
_を作成するとしましょう)、その深さとして何を選択しますか?それは深さを意味します。また、フィルターの寸法はどうなりますか?
また、これについての直観を提供するリンクを誰かが提供できるなら、非常に役立ちます。
編集:だからチュートリアルの一部(実世界の例の部分)で、それはThe Krizhevsky et al. architecture that won the ImageNet challenge in 2012 accepted images of size [227x227x3]. On the first Convolutional Layer, it used neurons with receptive field size F=11, stride S=4 and no zero padding P=0. Since (227 - 11)/4 + 1 = 55, and since the Conv layer had a depth of K=96, the Conv layer output volume had size [55x55x96].
と言います
ここで、深さは96であることがわかります。または私が計算する何か?また、上記の例(Krizhevsky et al)では、深さは96でした。では、96の深さはどういう意味ですか?また、チュートリアルにはEvery filter is small spatially (along width and height), but extends through the full depth of the input volume
と記載されていました。
つまり、深さは次のようになりますか?もしそうなら、私は_Depth = Number of Filters
_を仮定できますか?
ディープニューラルネットワークでは、深さとはネットワークの深さを指しますが、このコンテキストでは、深さは視覚認識に使用され、画像の3rd次元に変換されます。
この場合、画像があり、この入力のサイズは32x32x3であり、(width, height, depth)
。深さがトレーニング画像のさまざまなチャネルに変換されるため、ニューラルネットワークはこのパラメーターに基づいて学習できる必要があります。
UPDATE:
CNNの各レイヤーで、トレーニング画像に関する規則性を学習します。最初のレイヤーでは、規則性は曲線とエッジであり、レイヤーに沿って深く進むと、色、形、オブジェクトなどのより高いレベルの規則性を学習し始めます。これは基本的なアイデアですが、技術的な詳細がたくさんあります。さらに進む前に、これを試してみてください: http://www.datarobot.com/blog/a-primer-on-deep-learning/
更新2:
指定したリンクの最初の図をご覧ください。 'この例では、赤の入力レイヤーが画像を保持しているため、幅と高さが画像の寸法になり、深さが3(赤、緑、青のチャンネル)になります。'これは、ConvNetニューロンがニューロンを3次元に配置することにより入力画像を変換することを意味します。
あなたの質問への答えとして、深さは画像の異なる色チャンネルに対応します。
また、フィルターの深さについて。チュートリアルにはこれが記載されています。
すべてのフィルターは空間的に(幅と高さに沿って)小さくなりますが、入力ボリュームの深さ全体に広がります。
これは基本的に、フィルターは画像の規則性を学習するために画像の深さを移動する画像の小さな部分であることを意味します。
更新3:
実世界の例については、元の論文を参照したところ、次のように書かれています:最初の畳み込み層は、サイズ11×11×3の96カーネルと4ピクセルのストライドで224×224×3入力画像をフィルタリングします。
チュートリアルでは、深さをチャネルと呼びますが、現実の世界では、好きな次元を設計できます。結局のところ、あなたのデザイン
チュートリアルでは、ConvNetが理論的にどのように機能するかを垣間見ることを目的としていますが、ConvNetを設計する場合、だれも異なる深さの提案を止めることはできません。
これは理にかなっていますか?
これがなぜそれほどひっくり返されるのかはわかりません。私も最初はそれを理解するのに苦労しましたが、Andrej Karpathy以外ではごくわずかしか説明していません(d00dに感謝します)。ただし、彼の記事( http://cs231n.github.io/convolutional-networks/ )では、アニメーションとは異なる例を使用して出力ボリュームの深さを計算しています。
「Numpy examples」というタイトルのセクションを読むことから始めます
ここでは、繰り返します。
この場合、11x11x4があります。 (4から始める理由は、3の深さで把握しやすいため、ちょっと変わっています)
本当にこの行に注意を払ってください:
位置(x、y)の深度列(または繊維)は、アクティベーションX [x、y ,:]になります。
深度スライス、または深度dの活性化マップは、活性化X [:、:、d]になります。
V[0,0,0] = np.sum(X[:5,:5,:] * W0) + b0
Vは出力ボリュームです。 0番目のインデックスv [0]は列です-この場合_V[0] = 0
_これは出力ボリュームの最初の列です。 _V[1] = 0
_これは出力ボリュームの最初の行です。 _V[3]= 0
_は深さです。これが最初の出力層です。
さて、ここで人々が混乱します(少なくとも私はそうしました)。入力深度は、出力深度とはまったく関係ありません。入力の深さは、フィルターの深さのみを制御します。 W
Andrejの例では。
余談:多くの人は、なぜ3が標準入力深度なのか疑問に思っています。カラー入力画像の場合、これはプレーンole画像の場合は常に3です。
np.sum(X[:5,:5,:] * W0) + b0
(畳み込み1)
ここでは、5x5x4の重みベクトルW0の間で要素ごとに計算しています。 5x5は任意の選択です。 4は、入力深度を一致させる必要があるため、深度です。重みベクトルは、フィルター、カーネル、受容野、または人々がそれを道と呼ぶ難読化された名前です。
これを非pythonバックグラウンドから来た場合、配列スライシング表記法は直感的ではないので混乱が生じるのかもしれません。計算は最初の畳み込みサイズ(5x5x4)のドット積です。重みベクトルを使用した画像出力は、最初のフィルター出力行列の位置をとる単一のスカラー値入力全体にわたるこれらの畳み込み演算の合計積を表す4 x 4行列を想像してください。 Andrejの記事では、彼はx軸に沿って動き始めますが、y軸は同じままです。
以下は、畳み込みに関して_V[:,:,0]
_がどのように見えるかの例です。ここで覚えておいてください、インデックスの3番目の値は出力レイヤーの深さです
_[result of convolution 1, result of convolution 2, ..., ...] [..., ..., ..., ..., ...] [..., ..., ..., ..., ...] [..., ..., ..., result of convolution n]
_
アニメーションはこれを理解するのに最適ですが、Andrejは上記の計算と一致しない例と交換することにしました。
これには時間がかかりました。 numpyはAndrejが彼の例のようにインデックス付けしないので、少なくとも、私はそれで遊んでいませんでした。また、和の積演算が明確であるといういくつかの仮定があります。これは、出力レイヤーの作成方法、各値の意味、深さを理解するための鍵です。
うまくいけばそれが助けてくれます!
CONVレイヤーの深さは、使用しているフィルターの数です。フィルターの深さは、入力として使用している画像の深さと同じです。
例:227 * 227 * 3の画像を使用しているとしましょう。ここで、サイズが11 * 11(空間サイズ)のフィルターを使用しているとします。この11 * 11の正方形を画像全体に沿ってスライドさせて、応答として単一の2次元配列を生成します。ただし、そうするためには、11 * 11領域内のすべての側面をカバーする必要があります。したがって、フィルターの深さは画像の深さ= 3になります。ここで、それぞれが異なる応答を生成する96個のフィルターがあるとします。これは、畳み込み層の深さです。単に使用されるフィルターの数です。
画像分類問題を行っているときの入力ボリュームはN x N x 3
であるためです。最初は、深さの意味を想像するのは難しくありません-チャンネル数だけ-Red, Green, Blue
。さて、最初のレイヤーの意味は明確です。しかし、次のものはどうですか?アイデアを視覚化する方法を次に示します。
各レイヤーで、入力を中心に畳み込む一連のフィルターを適用します。現在、最初のレイヤーにいて、サイズN x N x 3
のボリュームV
を中心に畳み込んでいると想像してください。 @Semih Yagciogluが最初に言及したように、いくつかの大まかな機能を探しています。カーブ、エッジなどです。同じサイズ(3x3)のN個のフィルターをストライド1で適用するとします。 V
を中心にした曲線またはエッジ。もちろん、フィルターの深さは同じです。グレースケール表現だけでなく、情報全体を提供したいと思います。
これで、M
フィルターがM個の異なる曲線またはエッジを探す場合。そして、これらの各フィルターは、スカラーで構成される特徴マップを生成します(スカラーの意味は、この曲線が存在する確率はX%であるというフィルターです)。ボリュームの周りで同じフィルターで畳み込むと、このスカラーのマップを取得して、正確にどこで曲線を見たのかを知ることができます。
次に、機能マップスタッキングが登場します。次のようにスタッキングを想像してください。各フィルターが特定の曲線を検出した場所に関する情報があります。ニース、それらを積み重ねると、入力ボリュームの各小さな部分で利用可能な曲線/エッジに関する情報を取得します。これが最初の畳み込み層の出力です。
3
を考慮すると、非線形性の背後にある考え方を把握するのは簡単です。いくつかの機能マップにReLU関数を適用するとき、次のように言います。この場所の曲線またはエッジのすべての負の確率を削除します。そして、これは確かに理にかなっています。
次に、次のレイヤーの入力は、異なる空間位置で異なる曲線とエッジに関する情報を保持するボリューム$ V_1 $になります(各レイヤーは1つの曲線またはエッジに関する情報を保持します)。
これが理にかなっていることを願っています。有名なCS231コースが提供する驚くべきグラフを見て、特定の場所での各フィーチャの確率が正確に計算される方法を確認してください。
最初に注意する必要があるのは
receptive field of a neuron is 3D
すなわち、受容野が5x5の場合、ニューロンは5x5x(入力深度)のポイントに接続されます。したがって、入力深度に関係なく、ニューロンの1つの層は出力の1つの層のみを開発します。
さて、次に注意すべきことは
depth of output layer = depth of conv. layer
つまり、出力ボリュームは入力ボリュームとは無関係であり、フィルターの数(深さ)のみに依存します。これは、前のポイントからかなり明白なはずです。
フィルターの数(cnnレイヤーの深さ)はハイパーパラメーターであることに注意してください。画像の深さに関係なく、好きなように撮影できます。各フィルターには独自の重みセットがあり、フィルターでカバーされる同じローカル領域で異なる機能を学習できます。
ネットワークの深さは、ネットワーク内の層の数です。 Krizhevsky ペーパーでは、深さは9層です(層のカウント方法に関するフェンスポストの問題を修正しますか?)。
簡単に言えば、以下のように説明できます。
10個のフィルターがあるとします。ここで各フィルターは5x5x3のサイズです。これは何を意味するのでしょうか?このレイヤーのdepthは1で、これはフィルターの数と同じです。各フィルターのサイズは、必要に応じて定義できます。この場合は5x5x3で、3は前のレイヤーの深さです。正確には、次のレイヤーの各ファイラーの深さは10(nxnx10)である必要があります。ここで、nは5などの任意の値に定義できます。すべてが明確になることを願っています。