1

コンビネーションがどのように機能するかを直感的に説明するこの素晴らしいarticleを見つけました。Caffe convレイヤの重みとディメンション

形状の入力データ1×13×19×19、および128フィルタCONV層で:

layers { 
    name: "conv1_7x7_128" 
    type: CONVOLUTION 
    blobs_lr: 1. 
    blobs_lr: 2. 
    bottom: "data" 
    top: "conv2" 
    convolution_param { 
    num_output: 128 
    kernel_size: 7 
    pad: 3 
    weight_filler { 
     type: "xavier" 
     } 
     bias_filler { 
     type: "constant" 
     } 
    } 
} 

レイヤ今まさにカフェのCONV層の内部で何が起こっているかを理解しようと

私が正しく理解すれば、出力の形状は1 x 128 x 19 x 19です。

net->layers()[1]->blobs()た層の重み形状をみる:フィルタ(128)当り面(13)ごとに7×7行列:

layer 1: type Convolution 'conv1_7x7_128' 
    blob 0: 128 13 7 7 
    blob 1: 128 

はブロブ0ように見えるすべてのweigthsを有しています。

1 x 13 x 19 x 19のデータにブロブ0の畳み込みを行うと、正しく理解すれば128 x 13 x 19 x 19の出力になります(各7x7マトリックスは各ピクセルごとに1つの数値を生成するためパディングがあります)

  • 128 x 13 x 19 x 19はレイヤーの128 x 19 x 19出力にどのように変換されますか?

  • ブロブ1の128個の重みは何ですか?

ボーナスの質問:blobs_lrとは何ですか?

+1

ボーナスの質問についての簡単なgoogleは私にCfを導いた。人々が学習率の2つの異なる戦略を使用する理由についてのMNISTtutorial: blobs_lrは、学習可能なパラメータの学習率調整です。この場合、ウェイト学習率は実行時にソルバーが与えた学習率と同じに設定し、バイアス学習率はその2倍に設定します。これは通常より良い収束率につながります。 https://github.com/BVLC/caffe/issues/913 – Eliethesaiyan

答えて

3

caffeのprototxt形式の古いバージョンを引用しています。新しいフォーマットに調整すると、あなたはshape 1×13×19×19の入力データを持っている場合は、19×19
適用の空間的次元で13個のチャンネルを持って、あなたのbatch_sizeが1であることを意味し、あなたに

layer { # layer and not layer*s* 
    name: "conv1_7x7_128" 
    type: "Convolution" # tyoe as string 
    param { lr_mult: 1. } # instead of blobs_lr 
    param { lr_mult: 2. } # instead of blobs_lr 
    bottom: "data" 
    top: "conv2" 
    convolution_param { 
    num_output: 128 
    kernel_size: 7 
    pad: 3 
    weight_filler { 
     type: "xavier" 
     } 
     bias_filler { 
     type: "constant" 
     } 
    } 
} 

を与えます128の7×7フィルター(各フィルターは13の入力チャンネルすべてに適用されます)は、shape 13 x 7 x 7の128フィルターを持っていることを意味します(これは最初のレイヤーのパラメータのshapeです)。各フィルターを適用すると、出力チャンネル1 x 1 x 19 x 19という結果が得られます。そのようなフィルターは128個あり、1 x 128 x 19 x 19出力になります。

第2層のパラメータはバイアスです。各フィルタの結果に対する加算スカラです。あなたは層のconvolution_param

bias_term: false 

を追加することにより、バイアス項をオフにすることができます。

畳み込みレイヤーhereについて詳しく読むことができます。

ボーナス質問は、すでにhis commentでEliethesaiyanがうまく答えています。

+0

ありがとうございます。これは意味を持ち始めています。これは、 'blobs_lr'がdoc:' lr_mult' [それを置き換える](https://github.com/BVLC/caffe/issues/4896)に記載されていない理由を説明しています。私が欠けているのは、13個の7x7カーネルの出力が1つのフィルターにどのように組み合わされるかということです。彼らはちょうど一緒に追加されたと思いますか? – lemonsqueeze

+1

@lemonsqueeze a * single *フィルタは、13x19x19の入力blobに13x7x7のパラメータを「スライド」させます。各13x7x7パッチは、出力blob内の対応する位置に格納された* single *スカラーを生成します。パディングされた入力全体に単一の13x7x7フィルタを適用すると、1x19x19の出力が得られます。あなたのレイヤーには 'num_output:128'があります。したがって、それぞれが1x19x19スライスを生成する128種類のフィルターを持っています。レイヤーは128個のスライスを1つの出力ブロブ128x19x19に連結するだけです。 (先頭の '1x'は暗黙のうちに無視された「バッチサイズ」です) – Shai

+0

これでいいです。私は2D畳み込みが起こっていると思っていましたが、実際には各フィルターはただ1つの3D畳み込みであり、3次元は異なる平面です。 [記事](https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/)に戻るために、私たちは正方形ではなく、入力空間全体に渡る数字の立方体をスライドさせています。 – lemonsqueeze

関連する問題