如何将多个 N 维数组输入到 caffe 中的网络?

How to input multiple N-D arrays to a net in caffe?

我想在需要多个输入的 caffe 中为语义分割创建一个自定义损失层。我希望这个损失函数有一个额外的输入因子,以惩罚小物体的漏检。

为此,我创建了一个图像 GT,其中包含每个像素的权重。如果像素属于小物体,则权重很高。

我是 caffe 的新手,我不知道如何同时为我的网络提供三个二维信号(图像、gt-mask 和每像素权重)。我对caffe是如何做rgb数据和gt数据的对应关系存疑
我想扩展它以便有 2 gt 一个用于 class 标签图像,另一个将这个因素放入损失函数中。

你能给出一些提示来实现吗?

谢谢,

您想在 caffe 中为每个训练样本使用多个 N 维信号。您担心默认 "Data" 层只能处理一个图像作为训练样本。
这个问题有几种解决方案:

  1. 使用多个 "Data"(正如您在模型中所做的那样 linked to)。为了在三个 "Data" 层之间同步,您需要知道 caffe 按顺序从底层 LMDB 读取样本。因此,如果您以相同的顺序 准备三个 LMDB caffe 将按照样本放置的顺序一次从每个 LMDB 读取一个样本,因此三个输入将在 training/validation.
    期间同步 请注意,在准备 LMDB 之前 has a 'shuffle' flag, do NOT use it as it will shuffle your samples differently in each of the three LMDBs and you will have no sync. You are strongly advised to 你自己,但在某种程度上 same "shuffle" 应用于所有三个输入,使它们彼此同步。

  2. 使用 5 通道输入。 caffe 可以在 LMDB 中存储 N 维数据,而不仅仅是 color/gray 图像。您可以 use python 创建 LMDB,每个 "image" 是一个 5 通道数组,前三个通道是图像的 RGB,后两个是真实标签和每像素损失的权重.
    在您的模型中,您只需要在 "Data":

    之上添加一个 "Slice"
    layer {
      name: "slice_input"
      type: "Slice"
      bottom: "raw_input" # 5-channel "image" stored in LMDB
      top: "rgb"
      top: "gt"
      top: "weight"
      slice_param { 
        axis: 1
        slice_point: 3
        slice_point: 4
      }
    }
    
  3. 使用(我个人最喜欢的)。您可以将输入存储为二进制 hdf5 格式,并从这些文件中读取 caffe。在 caffe 中使用 "HDF5Data" 更加灵活,并允许您随心所欲地调整输入。在您的情况下,您需要准备一个包含三个 "datasets" 的二进制 hdf5 文件:'rgb''gt''weight'。您需要确保在创建 hdf5 文件时同步样本。一旦准备就绪,您就可以拥有一个包含三个 "top" 的 "HDF5Data" 图层。

  4. 编写自己的 "Python" 输入层。我不会在这里详细介绍。但是你可以在 python 中实现你自己的输入层。有关详细信息,请参阅