Updater не работает со словарем оптимизаторов - PullRequest
0 голосов
/ 26 сентября 2019

Я пытался изменить пример кода cifer в Chainer, чтобы он работал с несколькими оптимизаторами.

Как написано на странице 946 Документации Chainer (выпуск 7.0.0b3), я подумал, что функция,training.updaters.ParallelUpdater, может принимать не только объект оптимизатора, но также словарь, который отображает строки в оптимизаторы.

Итак, я поместил три объекта оптимизатора в словарь, настроил их для модели и поместил словарь в функцию ParallelUpdate в качестве аргумента.(см. код ниже)

optimizers = {}
optimizers['SGD'] = chainer.optimizers.SGD(args.learnrate)
optimizers['Adam'] = chainer.optimizers.Adam()
optimizers['RMSProp'] = chainer.optimizers.RMSprop()
      .
      .
for key in optimizers.keys() :
    optimizers[key].setup(model)
      .
      .
updater = training.updaters.ParallelUpdater(
        train_iter, optimizer=optimizers, devices = devices
    )

Однако программа выдает сообщение об ошибке следующим образом.

File "C:\WPy64-3720\python-3.7.2.amd64\lib\site-packages\chainer\training\updaters\parallel_updater.py", line 82, in __init__
    models = {'main': optimizer.target}

AttributeError: 'dict' object has no attribute 'target'

Я понимаю, что объект dict не является объектом оптимизатора, но ядумал, что описание в документе подразумевает, что оптимизаторы автоматически извлекаются из словаря.

Кто-нибудь знает, что не так с моим кодом или как заставить программу обновления работать с несколькими оптимизаторами?

1 Ответ

0 голосов
/ 27 сентября 2019

Чтобы использовать несколько оптимизаторов, необходимо переопределить метод update_core и предоставить настраиваемую логику для обновления с этими оптимизаторами.Функция принятия набора оптимизаторов предназначена для оптимизации нескольких различных целей с помощью отдельных оптимизаторов (например, GAN), а не для применения различных правил обновления для параметров одной цели.

Обратите внимание, что это означает, что в конечном итоге вам необходимо реализоватьпараллельное обновление самостоятельно, потому что ParallelUpdater.update_core, который вам нужно переопределить, фактически реализует распараллеливание.Я настоятельно рекомендую ChainerMN, который четко разделяет логику оптимизации и параллельное обучение.

...