如何组合不同网络的概率(软)输出并获得硬输出?

时间:2018-01-30 13:58:06

标签: caffe pycaffe matcaffe

我在caffe中分别训练了三个不同的模型,并且我可以获得属于每个类的概率以进行语义分割。我希望得到一个基于我得到的3个概率的输出(例如,三个概率的argmax)。这可以通过net模型和deploy.prototxt文件进行推断来完成。然后根据最终的软输出,硬输出显示最终的分割。 我的问题是:

  1. 如何获得这些网络的整体输出?
  2. 如何对三个网络的集合进行end-to-end培训?有没有资源可以获得帮助?
  3. 如何根据最终概率(例如,三个概率的argmax)获得最终分段,这是软输出?
  4. 我的问题听起来可能是非常基本的问题,我为此道歉。我仍在努力逐步学习。我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

有两种方法(至少我知道)可以解决(1)

  1. 一种方法是使用 pycaffe 接口,实例化三个网络,通过每个网络转发输入图像,获取输出并执行您希望组合所有三个概率的任何操作。如果您打算使用更复杂的逻辑组合它们,这将特别有用。

  2. 替代方法(不那么优雅)是使用caffe test并通过每个网络分别处理所有输入,将概率保存到文件中。然后在以后合并文件中的概率。

  3. 关于你的第二个问题,我从未训练超过两个分担体重的CNN(暹罗网络)。根据我的理解,您的网络不会分享权重,只有架构。如果您想对所有三个端到端进行培训,请查看此tutorial made for siamese networks。作者在prototxt两个路径/分支中定义,将每个分支的层连接到输入数据层,最后连接到丢失层。

    在您的情况下,您将定义三个分支(每个网络一个),连接输入数据层(检查每个分支是否处理相同的输入或不同的输入,例如,相同的图像预处理不同)与教程一样,将它们与损失联合起来。

    现在,对于最后一个问题,Caffe似乎有ArgMax layer可能正是您正在寻找的。如果你熟悉python,你也可以使用python layer,它允许你非常灵活地定义如何组合输出概率。