【问题标题】:How to input multiple N-D arrays to a net in caffe?如何将多个 N-D 数组输入到 caffe 中的网络?
【发布时间】:2017-12-23 19:47:59
【问题描述】:

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

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

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

您能否给出一些提示以实现这一目标?

谢谢,

【问题讨论】:

  • 尝试阅读this post。应该让你开始。如果您有更多具体问题,请随时在此处提问。就目前而言,您的问题“过于宽泛”。
  • 感谢 Shai 的回答。我已经看过你的帖子了。但我也有同样的疑问。首先,我将其用作网络参考 fcn_alexnet(github.com/NVIDIA/DIGITS/blob/master/examples/…) 首先我不明白的是:这个网络有 4 个输入数据: - 训练数据 - 训练 gt - val 数据 - val gt caffe 如何同步这个信息?我的意思是,caffe 是如何做火车数据和火车 gt 之间的对应关系的。这是我的第一个疑问。
  • 另一个疑问是。我想修改损失函数以合并比例因子,以惩罚小物体中的漏检。关于这一点,我知道我可以放置两个底部参数,以便将像素权重传递给损失函数训练 GT 和我的新 GT。但是我的输入数据层会是这样的: - 训练数据 - 训练 gt - 训练权重 gt​​ - val 数据 - val gt - val weight gt 如何管理 caffe 这个?如何确定当前的火车数据与正确的火车 gt 和火车重量 gt 相对应。
  • 我冒昧地改写你的问题。请确保编辑后的版本反映了您的原始问题。

标签: neural-network computer-vision deep-learning caffe image-segmentation


【解决方案1】:

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

  1. 使用多个 "Data"(就像在 linked to 模型中所做的那样)。为了在三个"Data" 层之间同步,您需要知道 caffe 按顺序从底层 LMDB 读取样本。因此,如果您以相同的顺序准备三个 LMDB,caffe 将按照样本放置顺序从每个 LMDB 一次读取一个样本,因此三个输入将在在训练/验证期间同步。
    请注意,convert_imageset 有一个 'shuffle' 标志,请不要使用它,因为它会在三个 LMDB 中的每一个中以不同的方式对您的样本进行洗牌,并且您将无法同步。强烈建议您在准备 LMDB 之前自行shuffle the samples,但要对所有三个输入应用相同“shuffle”,使它们彼此同步。

    李>
  2. 使用 5 通道输入。 caffe 可以在 LMDB 中存储 N-D 数据,而不仅仅是彩色/灰色图像。您可以use python 创建 LMDB,每个“图像”是一个 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. 使用"HDF5Data"(我个人最喜欢的)。您可以将输入存储为二进制 hdf5 格式,并让 caffe 从这些文件中读取。在 caffe 中使用 "HDF5Data" 更加灵活,并且允许您随心所欲地调整输入。在您的情况下,您需要准备一个包含三个“数据集”的二进制 hdf5 文件:'rgb''gt''weight'。您需要确保在创建 hdf5 文件时同步样本。准备好之后,您就可以拥有一个 "HDF5Data" 层,其中包含三个可供使用的“顶部”。

  4. 编写您自己的“Python”输入层。我不会在这里详细介绍。但是您可以在 python 中实现自己的输入层。详情请见this thread

【讨论】:

  • 你好,谢谢你的详细解释。根据您向我解释的内容,似乎最通用的解决方案是 HDF5Data 。我将尝试使用此解决方案进行实施。但我还有一个问题。关于 HDF5Data 如何管理 Caffe 使用的内存?我的意思是,Caffe 在初始化训练时,是在 ram 中加载整个 HDF5Data 还是只为每个批次加载必要的信息?
  • @Dhorka 老实说,我不知道。但根据我的经验,你可以拥有非常大的 HDF5 文件,但 caffe 仍然可以完美运行。所以我想它只会立即读取它需要的部分。
  • 感谢@Shai 的帮助。我会试试这个并报告回来。再次感谢。
猜你喜欢
  • 2015-11-19
  • 2018-04-23
  • 2021-03-09
  • 2016-03-31
  • 2019-12-15
  • 2019-04-02
  • 2015-05-21
  • 2016-09-23
  • 2018-02-12
相关资源
最近更新 更多