Neural network Caffe,批次间的操作

Neural network Caffe,批次间的操作,neural-network,deep-learning,caffe,conv-neural-network,Neural Network,Deep Learning,Caffe,Conv Neural Network,因为我有一个基于单个补丁分数的分类器,所以我想将网络对不同图像产生的预测相加 从 ,减少不支持在不同于上一个轴的轴上进行操作。 此外,池操作将生成其输入的平均值,但显然不涉及整个批次 我已经实现了python层,但这对于大规模实验来说还不够快 是否有一种方法可以“求和”,或者更一般地说,使用已有的工具在第一个轴上进行操作?是。你可以。如果您有nxpxqxrblob的预测,首先使用Slice(),创建Nblob,每个形状1xpxqxr。然后使用这些N水滴作为N底部的eltwise()层来生成一个顶

因为我有一个基于单个补丁分数的分类器,所以我想将网络对不同图像产生的预测相加

从 ,减少不支持在不同于上一个轴的轴上进行操作。 此外,池操作将生成其输入的平均值,但显然不涉及整个批次

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


是否有一种方法可以“求和”,或者更一般地说,使用已有的工具在第一个轴上进行操作?

是。你可以。如果您有
nxpxqxr
blob的预测,首先使用
Slice
(),创建
N
blob,每个形状
1xpxqxr
。然后使用这些
N
水滴作为
N
底部的
eltwise
()层来生成一个顶部。

如果您的预测具有以下维度:
nxc
(对于
N
c
通道的小批量大小),则可以将其拼接成
c
水滴,维度
N
。您可以将这些内容输入到
缩减层中

例如,您需要编写以下内容作为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
  }
}

我考虑过这一点,但我的问题是,
SliceLayer
将需要与批处理一样多的顶层blob(如果我没有错的话)。因为我需要100个顶级blob,所以我试图找到其他解决方案。那么您是担心您的.prototxt会变得复杂,还是担心执行时间?如果是后者(时间),那么您可以对其进行计时,而无需切片层和。关于编写prototxt,我通常使用Python代码来编写prototxt(受代码启发)。这使得写100个顶级blob非常容易。否则,我看不到任何其他使用现有层的方法。当然,您可以编写自己的层,它结合了
Slice
Eltwise
。谢谢您的完整回答。我更关心时间。我试试看,要花多少钱。