Caffe,批次之间的操作

时间:2016-08-10 16:45:34

标签: neural-network deep-learning caffe conv-neural-network

由于我有一个基于单个补丁分数的分类器,我想将网络为不同图像产生的预测加在一起。

https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto减少不支持与最后一个轴不同的轴操作。 此外,池化操作会产生其输入的平均值,但显然不会触及整个批次。

我已经实现了一个python层,但这对于大规模实验来说还不够快。

有没有办法“总结”,或者更常见的是,使用已有的工具在第一轴上操作?

2 个答案:

答案 0 :(得分:1)

是。您可以。如果您有N x p x q x r预测blob,则首先使用SliceSliceLayer),创建N个blob,每个形状1 x p x q x r。然后将这些N blob用作NEltwiseLayer)图层的eltwise底部,以生成单个顶部。

答案 1 :(得分:1)

如果您的预测具有尺寸:N x c(对于Nc频道的小批量尺寸),则可以将其拼接为c blob N。您可以将这些内容提供给Reduction图层。

例如,您要将以下内容编写为Jinja2模板:

layer {
  name: "pred-slice"
  type: "Slice"
  bottom: "pred"
{%- for num in range(10) %}
  top: "pred-{{ num }}-vector"
{%- endfor %}
  slice_param {
    slice_dim: 1
{%- for num in range(1, 10) %}
    slice_point: {{ num }}
{%- endfor %}
  }
  include {
    phase: TEST
  }
}

{%- for num in range(10) %}
layer {
  name: "pred-{{num}}"
  type: "Reduction"
  bottom: "pred-{{ num }}-vector"
  top: "pred-{{ num }}"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
{%- endfor %}

扩展为:

layer {
  name: "pred-slice"
  type: "Slice"
  bottom: "pred"
  top: "pred-0-vector"
  top: "pred-1-vector"
  top: "pred-2-vector"
  top: "pred-3-vector"
  top: "pred-4-vector"
  top: "pred-5-vector"
  top: "pred-6-vector"
  top: "pred-7-vector"
  top: "pred-8-vector"
  top: "pred-9-vector"
  slice_param {
    slice_dim: 1
    slice_point: 1
    slice_point: 2
    slice_point: 3
    slice_point: 4
    slice_point: 5
    slice_point: 6
    slice_point: 7
    slice_point: 8
    slice_point: 9
  }
  include {
    phase: TEST
  }
}
layer {
  name: "pred-0"
  type: "Reduction"
  bottom: "pred-0-vector"
  top: "pred-0"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-1"
  type: "Reduction"
  bottom: "pred-1-vector"
  top: "pred-1"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-2"
  type: "Reduction"
  bottom: "pred-2-vector"
  top: "pred-2"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-3"
  type: "Reduction"
  bottom: "pred-3-vector"
  top: "pred-3"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-4"
  type: "Reduction"
  bottom: "pred-4-vector"
  top: "pred-4"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-5"
  type: "Reduction"
  bottom: "pred-5-vector"
  top: "pred-5"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-6"
  type: "Reduction"
  bottom: "pred-6-vector"
  top: "pred-6"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-7"
  type: "Reduction"
  bottom: "pred-7-vector"
  top: "pred-7"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-8"
  type: "Reduction"
  bottom: "pred-8-vector"
  top: "pred-8"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}
layer {
  name: "pred-9"
  type: "Reduction"
  bottom: "pred-9-vector"
  top: "pred-9"
  include {
    phase: TEST
  }
  reduction_param {
    operation: MEAN
  }
}