1x1畳み込みは、完全に接続されたレイヤーとどのように同じですか?


55

最近、1x1畳み込みに関するYan LeCunsのコメントを読みました。

畳み込みネットでは、「完全に接続されたレイヤー」などはありません。1x1畳み込みカーネルと完全な接続テーブルを持つ畳み込み層のみがあります。

ConvNetsが固定サイズの入力を必要としないことは、あまりにもまれな事実です。単一の出力ベクトル(空間範囲なし)を生成する入力でそれらをトレーニングし、それらを大きな画像に適用できます。単一の出力ベクトルの代わりに、出力ベクトルの空間マップを取得します。各ベクトルは、入力上の異なる位置にある入力ウィンドウを認識します。 そのシナリオでは、「完全に接続されたレイヤー」は実際には1x1の畳み込みとして機能します。

これの簡単な例を見てみたい。

完全に接続されたネットワークがあると仮定します。入力レイヤーと出力レイヤーのみがあります。入力層には3つのノードがあり、出力層には2つのノードがあります。このネットワークが有する32=6のパラメータを。さらに具体的にするために、出力レイヤーとウェイトマトリックスにReLUアクティベーション関数があるとしましょう。

W=(011235)R2×3b=(813)R2

ように、ネットワークは、f(x)=ReLU(Wx+b)xR3

たたみ込み層はどのように見える必要がありますか?LeCunは「フル接続テーブル」とはどういう意味ですか?

同等のCNNを取得するには、まったく同じ数のパラメーターが必要です。上記からMLPが有する23+2=8のパラメータを。

回答:


29

あなたの例

この例では、3つの入力ユニットと2つの出力ユニットがあります。たたみ込みを適用するには、それぞれshape:[1,1,3]およびを持つユニットを考えます[1,1,2]。CNNの用語では、3入力および2出力フィーチャマップがあり、それぞれが空間次元を持ち1 x 1ます。

n x nk[n,n,k]1x1[1, 1, 3]221×11×1×number of channels of the input


w1=(011)R3w2=(235)R3b=(813)R2

f(x)=ReLU((w1xw2x)+(b1b2))xR3

実際のコードでの変換

実際の例については、私のvgg-fcn実装もご覧ください。このファイルで提供されるコードはVGGの重みを使用しますが、完全に接続されたすべてのレイヤーを畳み込みレイヤーに変換します。結果のネットワークは、vggshapeの入力画像に適用されたときと同じ出力を生成します[244,244,3]。(パディングなしで両方のネットワークを適用する場合)。

変換された畳み込み層が関数に導入されます_fc_layer(145行目)。これらは7x7FC6のカーネルサイズを持ちます(これは最大でpool5、VGGはshapeの機能マップを出力します[7,7, 512]。レイヤーでFC7ありFC81x1畳み込みとして実装されます。

「フル接続テーブル」

100%確信はありませんが、彼は入力フィーチャマップと同じ次元を持つフィルター/カーネルを参照している可能性があります。両方の場合(コードと例)、フィルターの空間次元が入力としての空間次元と同じであるという意味で、空間次元は最大です。


「したがって、1x1畳み込みのカーネルは形状[1、1、3]になります。」何?畳み込みについてのより大きな誤解があるようです。たたみ込みカーネルの形状が[1、1、3]であれば、1x1x3のたたみ込みだと思いますか?それで、1x1畳み込みは、出力に関するものであり、カーネルに関するものではありませんか?
マーティントーマ

2
私にとってkernel = filter、あなたは同意しますか?>>「だから、1x1の畳み込みはないカーネルは?必ずしもすべてで、出力のみについてです。Aの3x3コンボリューションは、任意の出力形状を有することができる。」確かに、パディングを使用している場合stride=1、その後output shape = input shape。>>「畳み込みカーネルの形状が[1、1、3]であれば、1x1x3の畳み込みだと思うだろうか?」いいえ、誰かが3x3x512畳み込みについて話しているのを聞いたことがありません。しかし、私が見たすべての畳み込みフィルターには、入力レイヤーの特徴マップの数に等しい3番目の空間次元があります。
-MarvMind

参考として、Convolution DemoKarpathies CS321nコースのcs231n.github.io/convolutional-networks/#convをご覧ください。またはtensorflow APIで:tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2dフィルターはshapeを持つことになっています [filter_height, filter_width, in_channels, out_channels]
MarvMind

「1x1畳み込みは入力の1 x 1 xチャンネル数」というものを答えに追加できますか?これが私の混乱の原因であり、私はこれを忘れ続けています。
マーティントーマ

はい、どうぞ!
-MarvMind


2

同等のカーネルは、入力の形状を単純に持ち、テンソルドット積を計算します。(「サイズ」をめぐる混乱があるように思われるため、「形状」という言葉を使用しますが、これはチャネル/深さの次元をしばしば無視します)。カーネルは可能な限り大きいので、「入力間でカーネルをスライドさせる」必要はありません。スタンフォードCS 231nコースノートの引用:

FCレイヤーはCONVレイヤーに変換できます。たとえば、サイズ7×7×512の入力ボリュームを見ているK = 4096のFCレイヤーは、F = 7、P = 0、S = 1、K = 4096、FのCONVレイヤーとして同等に表現できます。 = 7、P = 0、S = 1、K = 4096。つまり、フィルターサイズを入力ボリュームのサイズに正確に設定しているため、1つの深度列のみが入力ボリューム全体に「適合する」ため、出力は1×1×4096になります。最初のFCレイヤー。

ここで「F = 7、P = 0、S = 1、K = 4096、F = 7、P = 0、S = 1、K = 4096」とは、各convカーネルの形状が7x7x512であり、そのようなフィルターが4096個あることを意味すると思います。

以前の回答では、AlexNetの最後のfc(形状1x1x4096で入力を受け取り、1000クラススコアを計算)は「1x1畳み込み」として実装されていると述べました。完全にするために、そのようなconvカーネルはそれぞれ形状が 1x1x4096で、1000個あります。

Le Cunn は、CNN論文の 8ページ、LeNet5の説明でもこれを説明しています。

レイヤーC5は、120の機能マップを持つ畳み込みレイヤーです。各ユニットは、S4の16個すべての機能マップ上の5x5の近隣に接続されています。ここでは、S4のサイズも5x5であるため、C5の機能マップのサイズは1x1です。これは、S4とC5間の完全な接続に相当します。


1

私のような初心者のPyTorchユーザーには、「完全に接続されたレイヤー」と「線形レイヤー」を混同しないでください。

線形レイヤーと1x1畳み込みは同じものです。「完全に接続されたレイヤー」というものは存在しないことを理解するのに少し時間がかかりました-それは単に空間次元を1Dの巨大なテンソルに平坦化することです。平坦化により、すべての空間位置のすべての要素が、別個の機能マップ/チャネル/次元(何でも呼びたい)として表示されます。私たちが適用するため、線形層平坦化テンソルを、我々が得る完全に接続され、明らかに、1x1の畳み込みと同じではありません操作を、。

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

完全に接続された層は、サイズの入力に対して単純に有効な nxn畳み込み層であると主張する他の答えnxnは、混乱します(ただし、正しい)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.