我有一个数据集,每个图像有大约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
关于这种分裂如何运作的任何想法?
答案 0 :(得分:2)
您建议的原始设置("HDF5Data"
图层包含三个top
s)是可能的,并且在caffe中非常好。实际上,caffe支持由网络形成的图中的任何方向a-cyclic数据流。您可以拥有多个bottom
个和多个损失图层。没关系。
如果您坚持使用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。