Pycafe- создание двух сетей с одинаковыми весами и отклонениями

#caffe #pycaffe

#caffe #pycaffe

Вопрос:

Я пытаюсь создать две сети с одинаковыми весами и отклонениями, и я ожидаю аналогичной кривой обучения. На итерации 2 все большие двоичные объекты в двух сетях одинаковы (данные и различия), но параметры (веса и отклонения) различны!

Что я здесь делаю не так?

примечание: в сети нет перетасовки для набора данных и уровня отсева.

Спасибо

 solver1 = caffe.SGDSolver('lenet_solver.prototxt')
solver2 = caffe.SGDSolver('lenet_solver.prototxt')
solver1.step(1)
solver2.step(1)
CopySolver(solver1,solver2)
for i in range(10):
   solver1.step(1)    
   solver2.step(1)
   print solver1.net.params['ip2'][1].diff
   print solver2.net.params['ip2'][1].diff

def CopySolver(SolverA,SolverB):
   params = SolverA.net.params.keys()
   paramsA = {pr: (SolverA.net.params[pr][0].data,SolverA.net.params[pr][1].data) for pr in params}    
   paramsB = {pr: (SolverB.net.params[pr][0].data,SolverB.net.params[pr][1].data) for pr in params}                  
   for pr in params:
       paramsB[pr][1][...] = paramsA [pr][1]  #bias
       paramsB[pr][0][...] = paramsA [pr][0]  #weights 
  

Ответ №1:

Вы не учли импульс решателя. После копирования параметров сети из одного объекта решателя в другой информация о импульсе решателя (например, SGD) по-прежнему различается между решателями 1 и решателей2. Если вы установите «momentum: 0» в вашем «lenet_solver.prototxt», вы должны получить ожидаемое поведение.

В противном случае вы также можете сохранить параметры, создать два новых объекта решателя, загрузить параметры и перезапустить обучение. Делая это, вы гарантируете, что обе сети запускаются без начального импульса. Вот пример того, как это может выглядеть:

 solver1 = caffe.SGDSolver('lenet_solver.prototxt')
solver2 = caffe.SGDSolver('lenet_solver.prototxt')
solver1.step(1)
solver2.step(1)

solver1.net.save("tmp.caffemodel")

solver1 = caffe.SGDSolver('lenet_solver.prototxt')
solver2 = caffe.SGDSolver('lenet_solver.prototxt')
solver1.net.copy_from("tmp.caffemodel")
solver2.net.copy_from("tmp.caffemodel")

for i in range(10):
   solver1.step(1)   
   solver2.step(1)
   print solver1.net.params['ip2'][1].diff
   print solver2.net.params['ip2'][1].diff
  

Ответ №2:

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

Комментарии:

1. В этом коде после первой итерации я копирую network1 в network2 (все отклонения и весь вес), тогда начальная точка остается такой же. Я ожидаю, что в процессе обучения нет никакой разницы между параметрами обеих сетей.