【问题标题】:How to reuse same network twice within a new network in CAFFE如何在 CAFFE 的新网络中重复使用相同的网络两次
【发布时间】:2015-11-30 01:55:48
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

    标签: neural-network deep-learning caffe


    【解决方案1】:

    使用同一网两次称为"Siamese network"。它在 caffe 中实现的方式是显式复制网络,但对每个参数 blob 使用 "name" 参数来创建底层参数的单个副本。见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 保存在名称为 "ip1_w""ip1_b".caffemodel 文件中。

    【讨论】:

    • 谢谢你,户田!我确实需要做一些网络手术,谢谢你指出关键字。这是一个带有示例的链接以供将来参考nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/…
    • 嗨 Shai,当我应用此方法时,我遇到了一些意外行为。权重在 N1 和 N2 之间共享的任何机会?如果是,有没有办法禁用它?我希望 N1 和 N2 成为 N 的独立副本。谢谢!
    • @user2476373 在这种情况下,您可能不需要为参数 blob 命名,只需为整个层使用相同的“名称”。
    • 那行不通。当我给两个图层赋予相同的名称时,加载的值不会被加载到两个图层(不确定是其中任何一个图层,还是只加载到第二个图层)。无论如何,我解决了这个问题,通过训练一个连体网络的一个步骤(学习率为 0),给每个重复层一个不同的名称,但让它们共享权重。然后保存这个新的重复网络的快照,并从这个快照中初始化我的网络的权重。再次感谢您在这里的帮助:)
    • @user2476373 不错的解决方法。你可以在 python 中进行所有这些权重操作
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 2016-05-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 2018-10-23
    • 2018-12-02
    相关资源
    最近更新 更多