Neural network 如何在CAFFE的新网络中重复使用同一网络两次
我有一个预先训练好的网络(我们称之为Neural network 如何在CAFFE的新网络中重复使用同一网络两次,neural-network,deep-learning,caffe,Neural Network,Deep Learning,Caffe,我有一个预先训练好的网络(我们称之为N),我想在一个新网络中使用两次。有人知道怎么复制吗?然后我想给每个副本分配一个不同的学习速率 例如(N1是N的第一个副本,N2是N的第二个副本),新网络可能看起来像: N1 --> [joint ip N2 --> layer] 我知道如何使用单个副本重复使用N,但是,由于N1和N2具有不同的(微调)学习率,我不知道如何制作两个N副本,并为每个副本分配不同的学习率 谢谢 两次使用同一张网叫做。它在caffe中的实现方式是显式复制网络,但
N
),我想在一个新网络中使用两次。有人知道怎么复制吗?然后我想给每个副本分配一个不同的学习速率
例如(N1
是N
的第一个副本,N2
是N
的第二个副本),新网络可能看起来像:
N1 --> [joint ip
N2 --> layer]
我知道如何使用单个副本重复使用N
,但是,由于N1
和N2
具有不同的(微调)学习率,我不知道如何制作两个N
副本,并为每个副本分配不同的学习率
谢谢 两次使用同一张网叫做。它在caffe中的实现方式是显式复制网络,但对每个参数blob使用
“name”
param来创建基础参数的单个副本。请参阅。一旦显式定义网络两次,就可以为每个副本分配不同的
“lr\u 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\u w”
和“ip1\u b”
谢谢谢了,托达!我确实需要做一些网络手术,谢谢你指出关键词。下面是一个链接,带有一个示例供将来参考。Hi Shai,当我应用这个方法时,我得到了一些意想不到的行为。是否有可能在N1和N2之间共享权重?如果是,有没有办法禁用它?我想N1和N2是N的独立副本。谢谢@user2476373在这种情况下,您可能不需要为参数blob指定名称,只需对整个层使用相同的“名称”,这是行不通的。当我给两个层赋予相同的名称时,加载的值不会同时加载到两个层(不确定是加载到其中任何一个层,还是只加载到第二个层)。无论如何,我解决了这个问题,通过训练暹罗网络的一个单步(学习率为0),给每个重复层一个不同的名称,但让它们共享权重。然后保存此新复制网络的快照,并从此快照初始化网络的权重。再次感谢您的帮助:)@user2476373这是一个很好的解决方法。您可以在python中执行所有这些权重操作