2017-04-11 9 views
1

私は2つのイメージサンプルを比較するためのsiameseネットワークを構築しようとしています。私はcaffeのMNISTの例に従った。Caffeのサイアムネットワークのトレーニング

私がしようとしているのは、完全に接続されたレイヤーではなく、完全に畳み込まれたサイアムネットワークを使用することです。私は深い学習を学び理解するためにこれをやっています。

独自のカスタムネットワークを作成しました。これは32 x 32サイズのRGBイメージパッチを取り、添付のPrototxtファイルで定義されたネットワークのいくつかのレイヤーを通過します。それを短く保つために、私はちょうどミラーであるネットワークの他の半分を削除しました。また、私は畳み込みレイヤーでPaddingを使用する方法を学びたいので、ここでも私の例でそれを試しています。あなたはconv3層に1のパディングを入れていることがわかります。

label1label2が同じであるので、私はと混乱していますいくつかのものがありますLABEL2

layer { 
    name: "data1" 
    type: "Data" 
    top: "data1" 
    top: "label" 
    include { 
    phase: TRAIN 
    } 
    data_param { 
    source: "Desktop/training/lmdb/train_1" 
    batch_size: 512 
    backend: LMDB 
    } 
} 

layer { 
    name: "data2" 
    type: "Data" 
    top: "data2" 
    top: "label2" 
    include { 
    phase: TRAIN 
    } 
    data_param { 
    source: "/Desktop/training/lmdb/train_2" 
    batch_size: 512 
    backend: LMDB 
    } 
} 
layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data1" 
    top: "conv1" 
    param { 
    name: "conv1_w" 
    lr_mult: 1 
    } 
    param { 
    name: "conv1_b" 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 32 
    pad: 0 
    kernel_size: 5 
    stride: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "conv1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "norm1" 
    type: "LRN" 
    bottom: "pool1" 
    top: "norm1" 
    lrn_param { 
    local_size: 5 
    alpha: 0.0001 
    beta: 0.75 
    } 
} 
layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "norm1" 
    top: "conv2" 
    param { 
    name: "conv2_w" 
    lr_mult: 1 
    } 
    param { 
    name: "conv2_b" 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 64 
    pad: 0 
    kernel_size: 1 
    stride: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "relu2" 
    type: "ReLU" 
    bottom: "conv2" 
    top: "conv2" 
} 
layer { 
    name: "conv3" 
    type: "Convolution" 
    bottom: "conv2" 
    top: "conv3" 
    param { 
    name: "conv3_w" 
    lr_mult: 1 
    } 
    param { 
    name: "conv3_b" 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 128 
    pad: 1 
    kernel_size: 3 
    stride: 2 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "relu3" 
    type: "ReLU" 
    bottom: "conv3" 
    top: "conv3" 
} 
# layer { 
# name: "dropout" 
# type: "Dropout" 
# bottom: "conv3" 
# top: "dropout" 
# dropout_param { 
#  dropout_ratio: 0.5 
# } 
# } 
layer { 
    name: "conv4" 
    type: "Convolution" 
    bottom: "conv3" 
    top: "conv4" 
    param { 
    name: "conv4_w" 
    lr_mult: 1 
    } 
    param { 
    name: "conv4_b" 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 1 
    pad: 0 
    kernel_size: 1 
    stride: 1 
    weight_filler { 
     type: "xavier" 
     std: 0.03 
    } 
    bias_filler { 
     type: "constant" 
     value: 0.2 
    } 
    } 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "conv4" 
    top: "pool2" 
    pooling_param { 
    pool: AVE 
    kernel_size: 7 
    stride: 1 


    } 
    } 

################# 
layer { 
    name: "loss" 
    type: "ContrastiveLoss" 
    bottom: "pool2" 
    bottom: "pool2_p" 
    bottom: "label" 
    top: "loss" 
    contrastive_loss_param { 
    margin: 1 
    } 
    include { 
    phase: TRAIN 
    } 
} 

をブロックするためにサイレント層を使用:

  1. は、畳み込み層の上にパディングを追加することが安全ですかそれは破壊的な効果を持つことができますか?
  2. 私はsiamaeseネットワークで読んだいくつかの論文では、完全に接続された層の後にL2-正規化を使用します。私はCaffe上でL2正規化レイヤーを見つけられませんでしたが、はalpha = 1beta = 0.5を設定することで同じことができます。
  3. 私のネットワークでは、conv4のレイヤーを平均してプールし、それを使って損失を計算しました。ContrastiveLossです。それができますか、またはconv4の出力を正規化する必要がありますか、ここで何か完全に間違っていますか?
  4. 畳み込み層の出力を損失関数に直接供給できますか?

私はあなたに正しい方向を示すのを助けてくれて本当に感謝します。私はそれが分類されるように公開することができないいくつかの細胞の約50Kのパッチのサンプル画像を使用しています。パッチのサイズは約25x25ですので、サイズを変更するには32x32

答えて

2

はい、convレイヤーにパディングを追加することは安全です。私はあなたがL2正規化のためにLRNレイヤーをドキュメントに記述されている方法で使うことができると思います。はい、CNNレイヤーの出力は、ロス関数で直接使用することができます。何も問題はありません。単なるブロブです。完全畳み込みネットワークでは、常にそうです。理論的にも、マージンに基づいた損失であるため、あなたの出力は対照的な損失が働くように制限する必要はありません。典型的には、ソフトマックス損失を伴う2値分類問題に対するコントラスト損失を変化させることは、一般に機能し、正規化の問題はない。

+0

お返事ありがとうございます@Bharat。ですから、CNNの出力を正規化せずに入力することができます。私はsoftmaxが確率出力のためだと思ったので、softmaxについて理解しませんでしたか?最後に、CaffeのLRNレイヤーについて、2つのオプションACROSSとWITHIN CHANNELがあります。私の場合は、WITHINが必要ですか? –

+1

はWITHINにする必要があります。はい、正規化がなくても動作する可能性がありますが、動作保証されていません。確率出力とは別にsoftmaxには、トレーニングプロセスに役立つ素敵な特性もあります。ニューラルネットのトレーニングで発生する正規化の問題の大部分を処理します。 – Bharat

関連する問題