Масштабный слой в Кафе

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

[&](){ ...your code... }(); // immediately executed lambda expression

функционально эквивалентен

{ ...your code... } // simple code block

. Это делает лямбда-выражения мощным инструментом для реорганизации сложных функций. Вы начинаете с упаковки раздела кода в лямбда-функции, как показано выше. Затем процесс явной параметризации можно выполнить постепенно с промежуточным тестированием после каждого шага. После полной настройки кодового блока (как показано в результате удаления &), вы можете переместить код во внешнее местоположение и сделать его нормальной функцией.

Аналогичным образом вы можете использовать лямбда-выражения для инициализации переменных на основе результата алгоритма ...

int a = []( int b ){ int r=1; while (b>0) r*=b--; return r; }(5); // 5!

Как способ разбиения вашей логики на программу, вы можете даже счесть полезным передать лямбда-выражение в качестве аргумента другому lambda expression ...

[&]( std::function algorithm ) // wrapper section
   {
   ...your wrapper code...
   algorithm();
   ...your wrapper code...
   }
([&]() // algorithm section
   {
   ...your algorithm code...
   });

Лямбда-выражения также позволяют создавать именованные вложенные функции , что может быть удобным способом избежать дублирования логики. Использование именованных lambdas также имеет тенденцию быть немного легче на глазах (по сравнению с анонимными встроенными лямбдами) при передаче нетривиальной функции в качестве параметра другой функции. Примечание: не забывайте точку с запятой после закрывающей фигурной скобки.

auto algorithm = [&]( double x, double m, double b ) -> double
   {
   return m*x+b;
   };

int a=algorithm(1,2,3), b=algorithm(4,5,6);

Если последующее профилирование показывает значительные служебные издержки инициализации для объекта функции, вы можете переписать это как нормальная функция.

16
задан Shai 14 June 2017 в 10:03
поделиться

1 ответ

В файле caffe.proto также есть некоторая документация по нему, вы можете выполнить поиск по «ScaleParameter».

Спасибо, куча за ваш пост :) Слой масштаба был именно тем, что я искал. В случае, если кто-то хочет пример для слоя, который масштабируется скаляром (0,5), а затем «добавляет» -2 (и эти значения не должны изменяться):

layer {
  name: "scaleAndAdd"
  type: "Scale"
  bottom: "bot"
  top: "scaled"
  param {
    lr_mult: 0
    decay_mult: 0
  }
  param {
    lr_mult: 0
    decay_mult: 0
  }
  scale_param {
    filler {
      value: 0.5    }
    bias_term: true
    bias_filler {
      value: -2
    }
  }
}

(Возможно, decay_mult не нужны но здесь. Но не знаю. См. комментарии. ) Кроме этого:

  • lr_mult: 0 - отключает обучение для «этого параметра» - я думаю, что первый "param {" всегда (?) относится к весам, второе к смещению (lr_mult не является специфичным для ScaleLayer)
  • filler: a "FillerParameter" [см. caffe.proto] , рассказывающий, как заполнить пропущенную секунду клякса. По умолчанию используется одна постоянная «значение: ...».
  • bias_filler: параметр, указывающий, как заполнить необязательный BLOB-объект смещения
  • bias_term: есть ли BLOB-объект смещения

Все они взяты из caffe.proto. И еще: я тестировал слой выше с обоими значениями наполнителя = 1.2.

10
ответ дан dasWesen 14 June 2017 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: