2017-02-01 4 views
0

Я хотел бы реализовать архитектуру нейронной сети в Caffe, которая будет работать по-разному на основе некоторой переменной. Например: полная сеть может использовать 10 уровней для 4 из 5 тренировок или тестирования итераций, но для всех других итераций она обрезает сеть и использует только последние 5 слоев. Это потребует, чтобы входной сигнал на первый уровень и вход на 5-й уровень были, конечно, одинаковыми, но мой основной вопрос заключается в том, как реализовать это переключение между двумя архитектурами во время обучения/тестирования.Как создать нестационарную архитектуру сети Caffe?

ответ

1

Я думаю, вы можете сделать это с помощью pycaffe и caffe.NetSpec(), но это не будет очень хороший код ...
С другой стороны, почему бы вам не тренироваться i итераций полной чистой, за исключением моментальный снимок, а затем «теплый старт» уменьшенной модели с сохраненным снимком?
То есть: есть 'full_trainval.prototxt' с 'full_solver.prototxt' сконфигурирован для обучения полной сети за i итераций и 'top_trainval.prototxt' с 'top_solver.prototxt' настроен на обучение только верхним слоям сети. Тогда

~$ $CAFFE_ROOT/build/tools/caffe train -solver full_solver.prototxt 

Когда этот этап до конца, убедитесь, что вы окончательный sanpshot сохранены, а затем

~$ $CAFFE_ROOT/build/tools/caffe train -solver top_solver.prototxt -snapshot full_train_last_snapshot.solverstate 

Наконец, вы можете использовать net_surgery для объединения весов двух фаз в один полный сеть.