如何在CAFFE中的新网络中重复使用同一网络两次

时间:2015-11-29 13:59:33

标签: neural-network deep-learning caffe

我有一个预训练网络(让我们称之为N)我想在新网络中使用两次。有谁知道如何复制它?然后我想为每个副本分配不同的学习率。

例如(N1N的第一个副本,N2N的第二个副本),新网络可能如下所示:

N1 --> [joint ip 
N2 -->    layer]

我知道如何使用单个副本重用N,但是,由于N1N2将具有不同的(微调)学习率,我不知道怎么能我制作了2份N副本,并为每个副本分配不同的学习率。

谢谢!

1 个答案:

答案 0 :(得分:3)

使用相同的网络两次称为"Siamese network"。它在caffe中的实现方式是明确地复制网络,但是为每个参数blob使用"name" param来创建基础参数的副本。见this prototxt for example
一旦明确地将网络打败两次,您就可以为每个副本分配不同的"lr_mult"参数。

因此,假设您的参考网络N有一个输入图层(我将在此示例中跳过)和一个名为"ip1"的内部产品图层。然后

 layer {
   name: "ip1_a"
   bottom: "data_a"
   top: "ip1_a"
   type: "InnerProduct"
   inner_product_param {
     num_output: 10
   }
   param {
     name: "ip1_w"  # NOTE THIS NAME!
     lr_mult: 1
   }
   param {
     name: "ip1_b"
     lr_mult: 2
   }
 }
 layer {
   name: "ip1_b"
   bottom: "data_b"
   top: "ip1_b"
   type: "InnerProduct"
   inner_product_param {
     num_output: 10
   }
   param {
     name: "ip1_w"  # NOTE THIS NAME: it's the same!
     lr_mult: 10 # different LR for this branch
   }
   param {
     name: "ip1_b"
     lr_mult: 20
   }
 }
 # one layer to combine them     
 layer {
   type: "Concat"
   bottom: "ip1_a"
   bottom: "ip1_b"
   top: "ip1_combine"
   name: "concat"
 }
 layer {
   name: "joint_ip"
   type: "InnerProduct"
   bottom: "ip1_combine"
   top: "joint_ip"
   inner_product_param {
     num_output: 30
   }
 } 

如果您进行了微调,您可能需要进行一些网络手术,以便将原始wieghts保存在名为.caffemodel"ip1_w"的{​​{1}}文件中。