После разбора многих ссылок на создание слоев Caffe в Python я все еще испытываю трудности с пониманием нескольких концепций. Может ли кто-нибудь прояснить их?
- Ниже описана структура python для blobs и весов для сети: Поиск градиента конвективного фильтра Caffe в отношении ввода.
- Структура сети и Solver объясняется здесь: Cheat sheet для caffe/pycaffe?.
- Пример определения уровня python находится здесь: pyloss.py on git.
- Здесь выполняется тестирование уровней: тестовый уровень на git.
- Здесь описывается разработка новых слоев для С++: git wiki.
Что мне еще не хватает:
-
setup()
метод: что мне здесь делать? Почему в примере я должен сравнить длину "нижнего" парама с "2"? Почему это должно быть 2? Кажется, это не размер партии, потому что это произвольно? И дно, насколько я понимаю, является блобом, а затем первым измерением является размер партии? -
reshape()
метод: поскольку я понимаю, что "нижний" входной параметр является блобом ниже уровня, а "верхний" параметр - это капля верхнего слоя, и мне нужно изменить верхний слой в соответствии с формой вывода моих вычислений с помощью прямого прохода, Но почему мне нужно делать это каждый проход вперед, если эти фигуры не меняются от прохода до прохода, меняются только веса? -
reshape
иforward
методы имеют 0 индексов для "верхнего" входного параметра. Зачем мне использоватьtop[0].data=...
илиtop[0].input=...
вместоtop.data=...
иtop.input=...
? О чем этот индекс? Если мы не используем другую часть этого верхнего списка, почему это так разоблачено? Я могу заподозрить его или совпадение с С++, но было бы хорошо знать точно. -
reshape()
, строка с:if bottom[0].count != bottom[1].count
что я здесь делаю? почему его размерность еще раз? И что я здесь пересчитываю? Почему обе части blobs (0 и 1) должны быть равны по количеству некоторых членов (
count
)? -
forward()
, который я определяю по этой строке:self.diff[...] = bottom[0].data - bottom[1].data
Когда он используется после прямого пути, если я его определяю? Можем ли мы использовать
diff = bottom[0].data - bottom[1].data
вместо этого считать потерю позже в этом методе, не присваивая
self
, или его выполнение с определенной целью? -
backward()
метод: что это о:for i in range(2):
? Почему снова диапазон составляет 2? -
backward()
, параметрpropagate_down
: почему он определен? Я имею в виду, если его True, градиент должен быть назначенbottom[X].diff
, как я вижу, но почему кто-то вызовет метод, который ничего не сделает с помощьюpropagate_down = False
, если он просто ничего не делает и все еще едет внутри?
Прошу прощения, если эти вопросы слишком очевидны, я просто не смог найти хорошее руководство, чтобы понять их и просить о помощи здесь.