如何在多任务设置中将多标签数据作为HDF5输入提供?

时间:2016-08-09 11:55:09

标签: neural-network deep-learning hdf5 caffe multilabel-classification

我有一个数据集,每个图像有大约101个标签。我知道,我必须使用HDF5数据层将我的数据输入网络。但问题是我有一个多任务设置。我的网络共享前5层的参数,然后分支。在101个标签中,我想向一个任务发送100个标签,向第二个任务发送1个标签。

现在,我该怎么做?我能以某种方式做到以下几点:

layer {
      name: "data"
      type: "HDF5Data"
      top: "data"
      top: "label1"           ############# A scalar label
      top :  "label2"          ######## A vector of size 100
      include {
        phase: TRAIN
      }
      hdf5_data_param {
      source: "path/to/the/text/file/test.txt"
      batch_size: 10
      }
}

上述设置中有两个顶级blob。一个用于100维向量(label2),另一个用于剩余标签(label1) 这种设置是否可能?

我还读过某个地方可以分割多维向量,指定原始文本文件本身的分割规范。在那种情况下,我将不得不使用单个顶部blob标签(101维)然后以某种方式拆分 在100-d和1-d(标量)的两个向量中的101-d向量。怎么办呢?
在这种情况下,该层需要:

layer {
      name: "data"
      type: "HDF5Data"
      top: "data"
      top :  "label"          ######## A vector of size 101
      include {
        phase: TRAIN
      }
      hdf5_data_param {
      source: "path/to/the/text/file/test.txt"
      batch_size: 10
      }
}
## Some layer to split the label blob into two vectors of 100-d and 1-d respectively

关于这种分裂如何运作的任何想法?

1 个答案:

答案 0 :(得分:2)

  1. 您建议的原始设置("HDF5Data"图层包含三个top s)是可能的,并且在caffe中非常好。实际上,caffe支持由网络形成的图中的任何方向a-cyclic数据流。您可以拥有多个bottom个和多个损失图层。没关系。

  2. 如果您坚持使用101个维度的单个label输入,则可以使用"Slice"图层

    进行拆分
    layer {
      type: "Slice"
      name: "slice/label"
      bottom: "label" # assuming shape batch_size-101-1-1
      top: "label1"   # first 1D label
      top: "label2"   # second 100D label
      slice_param {
        axis: 1  # along "channels" dimension
        slice_point: 1 # slice after the first element
      }
    }
    

    有关"Slice"图层参数的详细信息,请参阅caffe.proto