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

How to combine the probability (soft) output of different networks and get the hard output?

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

  1. 如何获得这些网络的集成输出?
  2. 如何end-to-end三个网络的集成训练?是否有任何资源可以获得帮助?
  3. 如何根据最终的概率(如argmax三种概率)得到最终的分割,即软输出?

我的问题听起来可能很基本,对此我深表歉意。我仍在尝试逐步学习。非常感谢您的帮助。

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

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

  2. 另一种方法(不太优雅)是使用 caffe test 并通过每个网络分别处理所有输入,将概率保存到文件中。稍后再结合文件中的概率。

关于你的第二个问题,我从未训练过超过两个权重共享 CNN(siamese 网络)。据我了解,您的网络不共享权重,只共享架构。如果你想端到端地训练所有三个,请看看这个 tutorial made for siamese networks。作者在他们的 prototxt 中定义了两个 paths/branches,将每个分支的层连接到输入数据层,最后是一个损失层。

在你的情况下,你将定义三个分支(每个网络一个),连接输入数据层(检查每个分支是否处理相同的输入或不同的输入,例如,预处理相同的图像differently) 并用 loss 将它们联合起来,类似于教程。

现在,对于最后一个问题,Caffe 似乎有一个 ArgMax layer that may be what you are looking for. If you are familiar with python, you could also use a python layer 可以让你非常灵活地定义如何组合输出概率。