私は2つのイメージサンプルを比較するためのsiameseネットワークを構築しようとしています。私はcaffeのMNISTの例に従った。Caffeのサイアムネットワークのトレーニング
私がしようとしているのは、完全に接続されたレイヤーではなく、完全に畳み込まれたサイアムネットワークを使用することです。私は深い学習を学び理解するためにこれをやっています。
独自のカスタムネットワークを作成しました。これは32 x 32
サイズのRGBイメージパッチを取り、添付のPrototxtファイルで定義されたネットワークのいくつかのレイヤーを通過します。それを短く保つために、私はちょうどミラーであるネットワークの他の半分を削除しました。また、私は畳み込みレイヤーでPaddingを使用する方法を学びたいので、ここでも私の例でそれを試しています。あなたはconv3
層に1のパディングを入れていることがわかります。
label1
とlabel2
が同じであるので、私はと混乱していますいくつかのものがあります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
}
}
をブロックするためにサイレント層を使用:
- は、畳み込み層の上にパディングを追加することが安全ですかそれは破壊的な効果を持つことができますか?
- 私はsiamaeseネットワークで読んだいくつかの論文では、完全に接続された層の後にL2-正規化を使用します。私はCaffe上でL2正規化レイヤーを見つけられませんでしたが、は
alpha = 1
とbeta = 0.5
を設定することで同じことができます。 - 私のネットワークでは、
conv4
のレイヤーを平均してプールし、それを使って損失を計算しました。ContrastiveLossです。それができますか、またはconv4
の出力を正規化する必要がありますか、ここで何か完全に間違っていますか? - 畳み込み層の出力を損失関数に直接供給できますか?
私はあなたに正しい方向を示すのを助けてくれて本当に感謝します。私はそれが分類されるように公開することができないいくつかの細胞の約50Kのパッチのサンプル画像を使用しています。パッチのサイズは約25x25
ですので、サイズを変更するには32x32
お返事ありがとうございます@Bharat。ですから、CNNの出力を正規化せずに入力することができます。私はsoftmaxが確率出力のためだと思ったので、softmaxについて理解しませんでしたか?最後に、CaffeのLRNレイヤーについて、2つのオプションACROSSとWITHIN CHANNELがあります。私の場合は、WITHINが必要ですか? –
はWITHINにする必要があります。はい、正規化がなくても動作する可能性がありますが、動作保証されていません。確率出力とは別にsoftmaxには、トレーニングプロセスに役立つ素敵な特性もあります。ニューラルネットのトレーニングで発生する正規化の問題の大部分を処理します。 – Bharat