Кафе, операции между партиями

Поскольку у меня есть классификатор, основанный на оценках одного патча, я хотел бы суммировать прогнозы, которые сеть выдает для разных изображений.

Из https://github.com/BVLC/caffe/blob/master/src/caffe/proto/caffe.proto, Reduction не поддерживает операцию над осью, отличной от последней. Кроме того, операция объединения будет производить среднее значение своих входных данных, но, очевидно, не затрагивая всю партию.

Я реализовал слой Python, но этого недостаточно для крупномасштабных экспериментов.

Есть ли способ «суммировать» или, в более общем смысле, работать с первой осью с помощью уже доступных инструментов?


person Lemm Ras    schedule 10.08.2016    source источник


Ответы (2)


Да. Ты сможешь. Если у вас есть N x p x q x r блоб предсказания, сначала используйте Slice (SliceLayer), создав N блобов , каждая из форм 1 x p x q x r. Затем используйте эти N капли в качестве N нижних слоев для слоя eltwise (EltwiseLayer), чтобы создать единый верхняя.

person Autonomous    schedule 10.08.2016
comment
Я думал об этом, но проблема в моем случае заключается в том, что для SliceLayer потребуется столько же верхних BLOB-объектов, сколько и пакетов (если я не ошибаюсь). Поскольку мне понадобилось бы 100 сотен больших двоичных объектов, я пытался найти другие решения. - person Lemm Ras; 11.08.2016
comment
Итак, вы обеспокоены тем, что ваш .prototxt станет сложным, или вас беспокоит время выполнения? Если это последнее (время), то вы можете засечь без среза слоя и с. Что касается написания prototxt, я обычно использую код Python для написания prototxt (вдохновленный этот код). Это делает написание 100 лучших BLOB-объектов очень простым. В противном случае я не вижу никакого другого метода, использующего существующие слои. Конечно, вы всегда можете написать свой собственный слой, сочетающий в себе Slice и Eltwise. - person Autonomous; 11.08.2016
comment
Спасибо за этот полный ответ. Меня больше волнует время. Я попробую и посмотрю, сколько это займет. - person Lemm Ras; 11.08.2016

Если ваши прогнозы имеют размеры: N x c (для размера мини-пакета каналов N и c), вы можете соединить их в c большие двоичные объекты с размером 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
  }
}
person Jonathan    schedule 09.11.2016