All test examples converge to one embedding point with siamese network model...

56 views
Skip to first unread message

YeoChan Yoon

unread,
Mar 23, 2016, 11:04:42 PM3/23/16
to Caffe Users

I'm tring to learn siamese network model for cifar10 data.


I built paired data using cifar10 data and trained with revised cifar10 model definition (original: https://github.com/ycyoon/caffe/blob/master/examples/cifar10/cifar10_full_train_test.prototxt) for siamese network.

I just appended feat layers for 2D embedding and changed weight filler from gausian to xavier.


Here's the revised model definition


name: "cifar10_siamese_train_test"
layer
{
  name
: "pair_data"
  type
: "Data"
  top
: "pair_data"
  top
: "sim"
  include
{
    phase
: TRAIN
 
}
  transform_param
{
    scale
: 0.00390625
 
}
  data_param
{
    source
: "examples/siamese/mnist_siamese_train_leveldb/"
    batch_size
: 64
 
}
}
layer
{
  name
: "pair_data"
  type
: "Data"
  top
: "pair_data"
  top
: "sim"
  include
{
    phase
: TEST
 
}
  transform_param
{
    scale
: 0.00390625
 
}
  data_param
{
    source
: "examples/siamese/mnist_siamese_test_leveldb/"
    batch_size
: 100
 
}
}
layer
{
  name
: "slice_pair"
  type
: "Slice"
  bottom
: "pair_data"
  top
: "data"
  top
: "data_p"
  slice_param
{
    slice_dim
: 1
    slice_point
: 1
 
}
}
layer
{
  name
: "conv1"
  type
: "Convolution"
  bottom
: "data"
  top
: "conv1"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  convolution_param
{
    num_output
: 20
    pad
: 0
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "pool1"
  type
: "Pooling"
  bottom
: "conv1"
  top
: "pool1"
  pooling_param
{
    pool
: MAX
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "relu1"
  type
: "ReLU"
  bottom
: "pool1"
  top
: "pool1"
}
layer
{
  name
: "norm1"
  type
: "LRN"
  bottom
: "pool1"
  top
: "norm1"
  lrn_param
{
    local_size
: 3
    alpha
: 5e-05
    beta
: 0.75
    norm_region
: WITHIN_CHANNEL
 
}
}
layer
{
  name
: "conv2"
  type
: "Convolution"
  bottom
: "norm1"
  top
: "conv2"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  convolution_param
{
    num_output
: 32
    pad
: 2
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "relu2"
  type
: "ReLU"
  bottom
: "conv2"
  top
: "conv2"
}
layer
{
  name
: "pool2"
  type
: "Pooling"
  bottom
: "conv2"
  top
: "pool2"
  pooling_param
{
    pool
: AVE
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "norm2"
  type
: "LRN"
  bottom
: "pool2"
  top
: "norm2"
  lrn_param
{
    local_size
: 3
    alpha
: 5e-05
    beta
: 0.75
    norm_region
: WITHIN_CHANNEL
 
}
}
layer
{
  name
: "conv3"
  type
: "Convolution"
  bottom
: "norm2"
  top
: "conv3"
  convolution_param
{
    num_output
: 64
    pad
: 2
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "relu3"
  type
: "ReLU"
  bottom
: "conv3"
  top
: "conv3"
}
layer
{
  name
: "pool3"
  type
: "Pooling"
  bottom
: "conv3"
  top
: "pool3"
  pooling_param
{
    pool
: AVE
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "ip1"
  type
: "InnerProduct"
  bottom
: "pool3"
  top
: "ip1"
  param
{
    lr_mult
: 1
    decay_mult
: 250
 
}
  param
{
    lr_mult
: 2
    decay_mult
: 0
 
}
  inner_product_param
{
    num_output
: 10
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "feat"
  type
: "InnerProduct"
  bottom
: "ip1"
  top
: "feat"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  inner_product_param
{
    num_output
: 2
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "conv1_p"
  type
: "Convolution"
  bottom
: "data_p"
  top
: "conv1_p"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  convolution_param
{
    num_output
: 20
    pad
: 0
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "pool1_p"
  type
: "Pooling"
  bottom
: "conv1_p"
  top
: "pool1_p"
  pooling_param
{
    pool
: MAX
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "relu1_p"
  type
: "ReLU"
  bottom
: "pool1_p"
  top
: "pool1_p"
}
layer
{
  name
: "norm1_p"
  type
: "LRN"
  bottom
: "pool1_p"
  top
: "norm1_p"
  lrn_param
{
    local_size
: 3
    alpha
: 5e-05
    beta
: 0.75
    norm_region
: WITHIN_CHANNEL
 
}
}
layer
{
  name
: "conv2_p"
  type
: "Convolution"
  bottom
: "norm1_p"
  top
: "conv2_p"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  convolution_param
{
    num_output
: 32
    pad
: 2
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "relu2_p"
  type
: "ReLU"
  bottom
: "conv2_p"
  top
: "conv2_p"
}
layer
{
  name
: "pool2_p"
  type
: "Pooling"
  bottom
: "conv2_p"
  top
: "pool2_p"
  pooling_param
{
    pool
: AVE
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "norm2_p"
  type
: "LRN"
  bottom
: "pool2_p"
  top
: "norm2_p"
  lrn_param
{
    local_size
: 3
    alpha
: 5e-05
    beta
: 0.75
    norm_region
: WITHIN_CHANNEL
 
}
}
layer
{
  name
: "conv3_p"
  type
: "Convolution"
  bottom
: "norm2_p"
  top
: "conv3_p"
  convolution_param
{
    num_output
: 64
    pad
: 2
    kernel_size
: 5
    stride
: 1
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "relu3_p"
  type
: "ReLU"
  bottom
: "conv3_p"
  top
: "conv3_p"
}
layer
{
  name
: "pool3_p"
  type
: "Pooling"
  bottom
: "conv3_p"
  top
: "pool3_p"
  pooling_param
{
    pool
: AVE
    kernel_size
: 3
    stride
: 2
 
}
}
layer
{
  name
: "ip1_p"
  type
: "InnerProduct"
  bottom
: "pool3_p"
  top
: "ip1_p"
  param
{
    lr_mult
: 1
    decay_mult
: 250
 
}
  param
{
    lr_mult
: 2
    decay_mult
: 0
 
}
  inner_product_param
{
    num_output
: 10
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "feat_p"
  type
: "InnerProduct"
  bottom
: "ip1_p"
  top
: "feat_p"
  param
{
    lr_mult
: 1
 
}
  param
{
    lr_mult
: 2
 
}
  inner_product_param
{
    num_output
: 2
    weight_filler
{
      type
: "xavier"
   
}
    bias_filler
{
      type
: "constant"
   
}
 
}
}
layer
{
  name
: "loss"
  type
: "ContrastiveLoss"
  bottom
: "feat"
  bottom
: "feat_p"
  bottom
: "sim"
  top
: "loss"
  contrastive_loss_param
{
    margin
: 1
 
}
}

However, when I tried to get embeding points from test examples, all outputs are converged to one same point. (for example, 0.38288754 -0.08905841)


I changed the cifar10 data to mnist data, however it also gives the same result.


Is there anything wrong with the definition file?

Subhabrata Debnath

unread,
Apr 3, 2017, 6:23:29 AM4/3/17
to Caffe Users
I am experiencing the same problem. Were you able to solve it ?
Reply all
Reply to author
Forward
0 new messages