現在、Udacity Deep Learning Tutorialを行っています。レッスン3では、1x1畳み込みについて説明します。この1x1コンボリューションは、Google Inception Moduleで使用されます。1x1コンボリューションとは何かを理解できません。
Yann Lecunによるこの投稿も見ました。
誰かが親切にこれを私に説明できますか?
現在、Udacity Deep Learning Tutorialを行っています。レッスン3では、1x1畳み込みについて説明します。この1x1コンボリューションは、Google Inception Moduleで使用されます。1x1コンボリューションとは何かを理解できません。
Yann Lecunによるこの投稿も見ました。
誰かが親切にこれを私に説明できますか?
回答:
形のテンソルを出力するconvレイヤーがあるとします:
この出力が 1x1フィルター、ゼロパディング、およびストライド1 を含むconvレイヤーに入力されると仮定します。この1x1 convレイヤーの出力は形状ます。
そのため、1x1 convフィルターを使用して、フィルター空間の次元を変更できます。場合、フィルター次元で次元が増加し、場合、次元が減少します。
実際、Google Inceptionの記事「Going Deeper with Convolutions」では、次のように述べています(太字は私のものであり、元の著者によるものではありません)。
少なくともこの単純な形式では、上記のモジュールの1つの大きな問題は、多数のフィルターを備えた畳み込み層の上では、控えめな数の5x5畳み込みでも法外に高価になる可能性があることです。
これは、提案されたアーキテクチャの2番目のアイデアにつながります。それ以外の場合、計算要件が過度に増加する場合は、次元の削減と投影を慎重に適用します。これは、埋め込みの成功に基づいています。低次元の埋め込みでも、比較的大きな画像パッチに関する多くの情報が含まれている可能性があります。削減として使用されることに加えて、整流線形アクティベーションの使用も含まれており、それらを二重目的にします。
Inceptionアーキテクチャでは、1x1畳み込みフィルターを使用して、フィルター次元の次元を減らします。上で説明したように、これらの1x1 convレイヤーは一般にフィルタースペースの次元を変更するために使用できます(増加または減少のいずれか)。Inceptionアーキテクチャでは、これらの1x1フィルターがフィルター次元空間で明示的に次元削減にどれだけ効果的であるかを確認します、空間次元空間ではありません。
1x1 convフィルターには他の解釈もあるかもしれませんが、特にGoogle Inceptionアーキテクチャのコンテキストでは、この説明の方が好きです。
1x1畳み込みは、入力ピクセルをそのすべてのチャネルとともに出力ピクセルにマッピングするだけで、周囲の何も見ません。非常に深い深度のボリュームを乗算するのは非常に遅いため、深度チャネルの数を減らすためによく使用されます。
input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)
input (256 depth) -> 4x4 convolution (256 depth)
一番下は約3.7倍遅いです。
理論的には、ニューラルネットワークは、ブルートフォースですべてを乗算する代わりに、これを使用して見るために入力する「色」を「選択」できます。
num_weights = in_depth x out_depth x kernel_size = 256x256x4x4
。最初のケースでは、num_weights = 256x64x1x1+64x265x4x4=256x64x17
。比率を取ると、256/17〜3.7になります。numの重みが入力深度と出力深度にどのように関連するかについての視覚化については、このペーパー9ページを確認してください。arxiv.org/pdf/1603.07285.pdf
1x1の畳み込みを理解できなかった主な理由は畳み込みが実際にどのように機能するかを理解できなかったためです。重要な要因は、複数のチャネル/フィルターの畳み込みの計算方法です。これを理解するために、私はこの答えも役に立ちました:
https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work
特に、Type 2.2は畳み込みの正しい記述です。
別の役立つ答え:
この回答では、入力/出力チャネルの組み合わせごとに個別のフィルターを使用する方法について説明します。これらのそれぞれを計算した後、結果は入力チャネル軸で合計され、出力チャネルの値が残ります。
これが私が見つけたビデオで、1x1畳み込みがどのように機能するかを理解するのに役立ちました。
私が得た主なものは次のとおりです。
1 * 1コンバージョン(別名、ネットワーク内のネットワーク)?
入力が(n_H、n_W、n_c_prev)であるとしましょう。あなたはできると思います(1 * 1 * n_c_prev)としての単一ニューロン(完全に接続されたネットワークは -IeなぜN / N / Wにワット)それはそれらを掛け合わ入力に(n_c_prev)数字に取って(1 * 1 * n_c_prev )次に、ReLuと出力(n_H、n_W)を追加して取得します。複数のフィルター(n_c)がある場合、出力は(n_H、n_W、n_C)になります。
したがって、プーリングレイヤーを使用して空間寸法(n_H、n_W)を削減し、1 * 1 convを使用してn_c_prev(つまりチャネル数)を削減することで、多くの計算を節約できます。例えば
したがって、テイクアウェイ
1_1畳み込み層を使用して、n_Cを削減できますが、n_H、n_Wは削減できません。
プール層を使用して、n_H、n_W、およびn_Cを減らすことができます。
1 * 1 CONVフィルターを使用して何をしていますか?基本的に「1 * 1 * num_input_channel_of_featureMap」サイズの重みを取り、サイズ「W H num_input_channel_of_featureMap」のイメージ/ featureMap上のこのボリュームを畳み込み(要素単位*の後に+)、サイズ「W * H」の出力を取得します。
これで、「#filters」という種類の「1 * 1 * num_input_channel_of_featureMap」を使用して、ボリューム「W H #filter」を最終出力として取得できます。
さらに正確に言うと、32個の異なる重み(1 * 1ボリューム)などの「1 * 1」を入力フィーチャマップの同じ位置にある1つのスライスに乗算し、ReLuに続いて、緑色ピクセルとして表示される単一の対応する番号を生成します!
1 * 1 CONVは、チャネル数を削減し、一部のネットワーク(INCEPTIONS)で計算を節約します。
しかし、もちろん、チャンネルの数を入力フィーチャマップの数と同じにしたい場合は、それでも問題ありません。1* 1 CONVが行うことの1つは、ReLU非線形性を単純に適用することです。 NN。
1x1フィルターのコンテキストでの次元削減に関するもう1つのアイデア:
たとえば、FCNから4096x8x8 fc7レイヤーを取得します。次のレイヤー(fc8と呼ぶ)がフィルターサイズ1で2048x8x8の場合はどうなりますか?fc7はネットワークの非常に奥深く、4096個の機能はそれぞれ意味的に豊富ですが、各ニューロン(入力画像は250x250x3など)には大きな受容野があります。言い換えると、ニューロンが非常に活発である場合、そのセマンティックフィールドのどこかに対応する機能が存在することがわかります。
たとえば、1x1フィルターを使用したfc8の左上のニューロンを取り上げます。同じ受容野(画像の左上隅)にある4096個のニューロン/機能すべてに接続し、それぞれが単一の機能によってアクティブになります。それらのいくつか(同じ500)が非常にアクティブです。結果のニューロンも非常にアクティブである場合、この受容野で1つ以上の特徴を識別することを学習した可能性があります。これをfc8の左上のニューロンに対して2048回行った後、それらのかなりの数(たとえば250)が非常にアクティブになります。つまり、fc7を介して同じ受容野から特徴を「収集」しました。 1。
次元を減らし続けると、ニューロンの数が減ると、同じ受容野から学習する特徴の数が増えます。また、空間パラメーター8x8は同じままなので、各ニューロンの「ビュー」を変更せず、空間の粗さを減少させません。
Long、Shelhamer、Darrelによる「Fully Convolutional Networks」をご覧ください。