После разбора многих ссылок на создание слоев 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, если он просто ничего не делает и все еще едет внутри?
Прошу прощения, если эти вопросы слишком очевидны, я просто не смог найти хорошее руководство, чтобы понять их и просить о помощи здесь.