#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 (все отклонения и весь вес), тогда начальная точка остается такой же. Я ожидаю, что в процессе обучения нет никакой разницы между параметрами обеих сетей.