在Caffe中使用多个预训练网络

7
有没有一种简单的方法(例如不修改代码)将多个预训练网络的权重加载到一个网络中?该网络包含一些与两个预训练网络具有相同尺寸和名称的层。
我正在尝试使用NVidia DIGITS和Caffe实现这一点。
编辑:我认为不能直接从DIGITS进行操作,如答案所确认。有人能建议一种简单的方式来修改DIGITS代码以便能够选择多个预训练网络吗?我稍微检查了一下代码,并认为training script是一个好的起点,但我对Caffe没有深入的了解,因此我不确定实现这一点的最佳/最快方法是什么。
2个回答

6
如Shai所建议的那样,这是无法完成的,所以我决定克隆官方仓库并进行相应更改。我更改了代码,以便使用冒号作为分隔符加载多个预训练网络。
我在官方仓库上创建了一个拉取请求,我的更改随后与DIGITS的主分支合并,这意味着现在可以在DIGITS中使用此功能。

你是否向BVLC/caffe存储库提交过类似的拉取请求? - Shai
您可以使用caffe通过使用逗号将不同的网络分隔开来,使用--weights参数来完成此操作。 - Igor Ševo

2
据我所知,没有直接的方法来完成这个任务。
但是,您可以使用网络手术来加载预训练模型,并手动将它们的权重分配给目标网络。一旦您拥有了一个单一的网络,所有的权重都根据各种预训练模型进行了初始化,您就可以保存它并将其用作您其他工作中的单个预训练模型。

1
这就是如何做...一个NN模型只是一堆权重,所以你需要做的就是复制它们并保存。祝你好运...不过如果你从不同的网络中复制层,它们可能无法很好地协作。Digits相当高级...你需要使用Python或C++来完成它。 - user1269942
有没有一种简单的方法将这个代码整合到 DIGITS 代码中(我编辑了问题)? - Igor Ševo
@IgorŠevo 如果你要尝试这个技巧很多次,你可以考虑修改DIGITS的训练脚本。然而,我认为如果你只打算这样做一两次,最好使用“网络手术”手动完成。 - Shai
我可能会使用不同的架构多次进行这个操作,所以我需要一些更高级的东西。 - Igor Ševo
@IgorŠevo 嗯,我认为修改训练脚本的第一步是在 Python 中编程实现这种修改。你能让它运行一次吗? - Shai
1
我可以尝试使用你建议的“网络手术”方法,并将修改后的代码添加到DIGITS训练脚本中。我希望Caffe能够提供一些API,用于从不同的网络加载权重。 - Igor Ševo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接