web-dev-qa-db-ja.com

畳み込みニューラルネットワーク-複数のチャネル

入力層に複数のチャネルが存在する場合、畳み込み演算はどのように実行されますか? (例:RGB)

CNNのアーキテクチャ/実装について少し読んだ後、機能マップの各ニューロンが、カーネルサイズで定義された画像のNxMピクセルを参照することを理解しました。次に、各ピクセルは、機能マップ学習NxM重みセット(カーネル/フィルター)によって因数分解され、合計され、アクティブ化関数に入力されます。単純なグレースケール画像の場合、操作は次の疑似コードに準拠したものになると思います。

for i in range(0, image_width-kernel_width+1):
    for j in range(0, image_height-kernel_height+1):
        for x in range(0, kernel_width):
            for y in range(0, kernel_height):
                sum += kernel[x,y] * image[i+x,j+y]

        feature_map[i,j] = act_func(sum)
        sum = 0.0

ただし、このモデルを拡張して複数のチャネルを処理する方法がわかりません。フィーチャマップごとに3つの個別のウェイトセットが必要であり、各色で共有されますか?

このチュートリアルの「共有ウェイト」セクションの参照: http://deeplearning.net/tutorial/lenet.html 機能マップの各ニューロンは、別々のニューロンから参照される色でレイヤーm-1を参照します。彼らがここで表現している関係がわかりません。ニューロンはカーネルまたはピクセルですか、なぜ画像の別々の部分を参照するのですか?

私の例に基づくと、単一のニューロンカーネルは、画像内の特定の領域に限定されているように見えます。なぜRGBコンポーネントを複数の領域に分割しているのですか?

22
Junkers

入力層に複数のチャネルが存在する場合、畳み込み演算はどのように実行されますか? (例:RGB)

そのような場合、入力チャネルごとに1つの2Dカーネルがあります(平面)。

したがって、各コンボリューション(2D入力、2Dカーネル)を個別に実行し、コントリビューションを合計して、最終的な出力フィーチャマップを取得します。

このスライド64を参照してください CVPR 2014チュートリアルMarc'Aurelio Ranzato による:

enter image description here

フィーチャマップごとに3つの個別のウェイトセットが必要であり、各色で共有されますか?

特定の出力機能マップを検討する場合、3 x 2Dカーネルがあります(つまり、入力チャネルごとに1つのカーネル)。各2Dカーネルは、入力チャネル全体(ここではR、G、またはB)に沿って同じ重みを共有します。

したがって、畳み込み層全体は4Dテンソルです(nb。入力平面x nb。出力平面xカーネル幅xカーネル高さ)。

なぜRGBコンポーネントを複数の領域に分割しているのですか?

上で詳述したように、各R、G、Bチャネルは、専用の2Dカーネルを備えたseparate入力プレーンとして考えます。

35
deltheil

チャンネルは独立しているはずなので、マックスはあまり意味がありません。さまざまなチャネルのさまざまなフィルターからの結果を最大にすることは、さまざまな側面を混ぜ合わせることです。

異なるチャネルからの出力を組み合わせるには、基本的に、出力を一緒に追加するfuncが必要です。私の意見では、ここでの追加機能の選択は、ユースケースによって異なります。 pytorch conv2dの実装によると、1つの実装は単に加算を行うことです。詳細は https://pytorch.org/docs/stable/nn.html を参照してください

0
Liyuan Zhang