Умножение Caffe Element-Wise с фиксированными каплями

Я думаю, что буду задавать здесь несколько вопросов, мне бы хотелось получить любой комментарий, потому что я новичок в Caffe.

В моей сети входные изображения имеют размер 1x41x41 Поскольку я использую размер пакета 64, я думаю, что размер данных будет 64x1x41x41 (пожалуйста, поправьте меня, если это неправильно)

После некоторых сверточных слоев (которые не меняют размер данных) я хотел бы умножить полученные данные на предопределенные капли размером 1x41x41. Кажется удобным использовать EltwiseLayer для умножения. Итак, чтобы определить второй нижний слой Eltwise, мне нужны другие входные данные для BLOB-объектов. (Пожалуйста, сообщите, если это можно сделать другим способом)

Первый вопрос: пакетное обучение меня смущает. Если я хочу умножить пакет изображений с одним пятном в EltwiseLayer, должны ли нижние размеры быть одинаковыми? Другими словами, должен ли я использовать repmat (matlab) для клонирования 64 больших двоичных объектов, чтобы они имели размер 64x1x41x41, или я могу просто подключить один двоичный объект размером 1x1x41x41?

Второй вопрос: я хочу умножить данные на 100 разных блоков, а затем взять среднее значение 100 результатов. Нужно ли мне определять 100 EltwiseLayers для выполнения этой работы? Или я могу собрать большие двоичные объекты в одиночные данные размером 1x100x41x41 (или 64x100x41x41) и клонировать данные, которые будут умножены 100 раз? И если да, то как я могу это сделать? Пример был бы очень полезен. (Я где-то видел TileLayer, но информация разлетелась по всей галактике.)

Заранее спасибо.


person Tarhan    schedule 30.09.2017    source источник
comment
использовать слой плитки вместо repmat   -  person Shai    schedule 01.10.2017
comment
какой смысл умножать 100 раз на фиксированные матрицы, а затем брать среднее значение? Возьмите среднее значение 100 матриц один раз и умножьте на блоб   -  person Shai    schedule 01.10.2017
comment
@Shai На самом деле ты прав, взяв среднее значение капель. Я не уверен, как мне объединить 100 результатов, может быть, я могу использовать maxpooling и т. д. Для слоя плитки ссылка не смогла ответить, как мне ее использовать; и я также не могу следовать документации doxygen, чтобы понять, какие параметры устанавливать.   -  person Tarhan    schedule 01.10.2017


Ответы (1)


Для выполнения поэлементного умножения в кафе оба блоба должны иметь точно одинаковую форму. Caffe не выполняет "трансляцию" по одноэлементному размеры.
Итак, если вы хотите умножить пакет из 64 больших двоичных объектов формы 1x41x41 каждый, вам придется предоставить два нижних двоичных объекта 64x1x41x41.
Как вы уже заметили, вы можете использовать "Tile", чтобы выполнить repmating:

layer {
  name: "repmat"
  type: "Tile"
  bottom: "const_1x1x41x41_blob"
  top: "const_64x1x41x41_blob"
  tile_param {
    axis = 0   # you want to "repmat" along the first axis
    tiles = 64 # you want 64 repetitions
  }
}

Теперь вы можете сделать "Eltwise" умножение

layer {
  name: "mul"
  type: "Eltwise"
  bottom: "const_64x1x41x41_blob"
  bottom: "other_blob"
  top: "mul"
  eltwise_param {
    operation: MUL
  }
}
person Shai    schedule 01.10.2017
comment
Пожалуйста, используйте операцию: PROD, а не операцию: MUL caffe.berkeleyvision.org/tutorial/layers/ eltwise.html - person myth510; 05.08.2020