ニューラルネットワークでの1x1畳み込みの意味


106

現在、Udacity Deep Learning Tutorialを行っています。レッスン3では、1x1畳み込みについて説明します。この1x1コンボリューションは、Google Inception Moduleで使用されます。1x1コンボリューションとは何かを理解できません。

Yann Lecunによるこの投稿も見ました。

誰かが親切にこれを私に説明できますか?


関連する質問
-gkcn

1
1x1コンボリューションについて詳しく説明したこれらのモジュールに関するブログ投稿は次のとおりです。hackathonprojects.wordpress.com
トミー

1
簡単に言えば、3Dボリュームのチャンネル数を減らして計算を高速化するという考え方です。
onerhao

回答:


113

形のテンソルを出力するconvレイヤーがあるとします:(N,F,H,W)

  • Nはバッチサイズです
  • Fは畳み込みフィルターの数です
  • H,Wは空間次元

この出力が 1x1フィルター、ゼロパディング、およびストライド1 を含むconvレイヤーに入力されると仮定します。この1x1 convレイヤーの出力は形状ます。F1(N,F1,H,W)

そのため、1x1 convフィルターを使用して、フィルター空間の次元を変更できます。場合、フィルター次元で次元が増加し、場合、次元が減少します。F1>FF1<F

実際、Google Inceptionの記事「Going Deeper with Convolutions」では、次のように述べています(太字は私のものであり、元の著者によるものではありません)。

少なくともこの単純な形式では、上記のモジュールの1つの大きな問題は、多数のフィルターを備えた畳み込み層の上では、控えめな数の5x5畳み込みでも法外に高価になる可能性があることです。

これは、提案されたアーキテクチャの2番目のアイデアにつながります。それ以外の場合、計算要件が過度に増加する場合は、次元の削減と投影を慎重に適用します。これは、埋め込みの成功に基づいています。低次元の埋め込みでも、比較的大きな画像パッチに関する多くの情報が含まれている可能性があります削減として使用されることに加えて、整流線形アクティベーションの使用も含まれており、それらを二重目的にします。

Inceptionアーキテクチャでは、1x1畳み込みフィルターを使用して、フィルター次元の次元を減らします。上で説明したように、これらの1x1 convレイヤーは一般にフィルタースペースの次元を変更するために使用できます(増加または減少のいずれか)。Inceptionアーキテクチャでは、これらの1x1フィルターがフィルター次元空間で明示的に次元削減にどれだけ効果的であるかを確認します、空間次元空間ではありません。

1x1 convフィルターには他の解釈もあるかもしれませんが、特にGoogle Inceptionアーキテクチャのコンテキストでは、この説明の方が好きです。


3
5x5 convを実装する前に、1x1 convが前のフィルター次元を1に圧縮するのですか?
レナード・ルー

1
@LeonardLooの各1x1カーネルはフィルターの次元を1に減らしますが、1つの1x1畳み込みで複数のカーネルを持つことができるため、「フィルター」の数は任意に選択できます。
ファゾリーニ

43

1x1畳み込みは、入力ピクセルをそのすべてのチャネルとともに出力ピクセルにマッピングするだけで、周囲の何も見ません。非常に深い深度のボリュームを乗算するのは非常に遅いため、深度チャネルの数を減らすためによく使用されます。

input (256 depth) -> 1x1 convolution (64 depth) -> 4x4 convolution (256 depth)

input (256 depth) -> 4x4 convolution (256 depth)

一番下は約3.7倍遅いです。

理論的には、ニューラルネットワークは、ブルートフォースですべてを乗算する代わりに、これを使用して見るために入力する「色」を「選択」できます。


19
1x1は、1つのピクセルを出力ピクセルにマッピングするだけでなく、すべての入力ピクセルチャネルを1つのピクセルにマッピングします。最初の行の例では、入力用に256個のチャネルがあり、64個の1x1カーネルのそれぞれが、256個すべての入力チャネルを1つの「ピクセル」(実数)にまとめます。その結果、同じ空間次元の256チャンネルではなく64チャンネルになり、2行目の例よりも4x4コンボリューションの計算が安価になります。
ファゾリーニ

良い点は、投稿を更新します:)
無料のデブレイユ

3
どこから3.7倍遅くなりましたか?
CMCDragonkai

@CMCDragonkai計算コストは​​重みの数に比例すると仮定します。後者の場合、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
ネルソンディン

11

1x1の畳み込みを理解できなかった主な理由は畳み込みが実際にどのように機能するかを理解できなかったためです。重要な要因は、複数のチャネル/フィルターの畳み込みの計算方法です。これを理解するために、私はこの答えも役に立ちました:any

https://datascience.stackexchange.com/questions/9175/how-do-subsequent-convolution-layers-work

特に、Type 2.2は畳み込みの正しい記述です。

別の役立つ答え:

https://ai.stackexchange.com/questions/5769/in-a-cnn-does-each-new-filter-have-different-weights-for-each-input-channel-or

この回答では、入力/出力チャネルの組み合わせごとに個別のフィルターを使用する方法について説明します。これらのそれぞれを計算した後、結果は入力チャネル軸で合計され、出力チャネルの値が残ります。

これが私が見つけたビデオで、1x1畳み込みがどのように機能するかを理解するのに役立ちました。

https://www.coursera.org/lecture/convolutional-neural-networks/networks-in-networks-and-1x1-convolutions-ZTb8x

私が得た主なものは次のとおりです。

  • 1x1畳み込みへの入力は、通常、サイズ x以前の畳み込みです。しかし、畳み込みの最後の層にフィルターがあった場合、形のマトリックスが得られます。1x1の畳み込みは、実際にはイメージ全体で畳み込む1つの x出力フィルターを作成するサイズベクトルです。 1x1畳み込みがある場合、すべての1x1畳み込みの出力はsizeです。mnf1(m,n,f1)f1mnf2(m,n,f2)
  • だから、1x1の畳み込みは、仮定、rerepresentingとして見ることができるを経由してフィルタをフィルター。これにより、ネットワークは次元を最も効率的に削減する方法を訓練できます。f2<f1f1f2

OK、これは適切に1x1の畳み込みを説明これまでのところ唯一の場所は、実際には有する「ドット」製品である(m,n,f1)
レッドフロイド

3

イラストを使って、より直感的かつ簡潔に説明しようと思います!

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


1

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」をご覧ください。


1
私は考えてあなたが左最上部のために、この2048回をやった後、」特に、この機構の別の良い直感であることが、私は混乱寸法のための表記法を見つけるために、それに戻って来ているつもりだ、とfc8 "のニューロン。
-WillC

あなたが何を言おうとしているのかよくわかりませんでした、もっと明確にしてください。
マイケルハイデルベルク

0

畳み込みの数学的操作は、考えられるすべてのシフト位置で2つの(連続または離散)関数の積を計算することを意味します。

2次元(グレーレベル)画像では、スライディングウィンドウ操作によって畳み込みが実行されます。ここで、ウィンドウ(2次元畳み込みカーネル)は行列です。v×v

畳み込みニューラルネットワークを含むニューラルネットワークの画像処理アプリケーションは、[M。Egmont-Petersen、D。de Ridder、H。Handels。ニューラルネットワークによる画像処理-レビューパターン認識、Vol。35、No. 10、pp。2279-2301、2002]。

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