Neural network Caffe,批次间的操作
因为我有一个基于单个补丁分数的分类器,所以我想将网络对不同图像产生的预测相加 从 ,减少不支持在不同于上一个轴的轴上进行操作。 此外,池操作将生成其输入的平均值,但显然不涉及整个批次 我已经实现了python层,但这对于大规模实验来说还不够快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()层来生成一个顶
是否有一种方法可以“求和”,或者更一般地说,使用已有的工具在第一个轴上进行操作?是。你可以。如果您有
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
。谢谢您的完整回答。我更关心时间。我试试看,要花多少钱。