расширения или даже наблюдение пусты с Chainer

Я новичок в Chainer, и недавно я столкнулся со странной ситуацией. У меня есть цепочка для вычисления CNN, которую я подаю с помощью labeledDataSet. Но никаких результатов не появляется, когда я использую расширения. Когда я показываю значение наблюдения, оно пусто. Но потери действительно подсчитываются и параметры обновляются (по крайней мере, они меняются), поэтому я не знаю, где проблема с подключением.

def convert(batch, device):
    return chainer.dataset.convert.concat_examples(batch, device, padding=0)
def print_obs(t):
    print("trainer.observation", trainer.observation)
    print("updater.loss", updater.loss_func)
    print("conv1", model.predictor.conv1.W[0][0])
    print("conv20", model.predictor.conv20.W[0][0])

model.predictor.train = True
model.predictor.finetune = False  ####or True ??
cuda.get_device(0).use()
model.to_gpu()
optimizer = optimizers.MomentumSGD(lr=learning_rate, momentum=momentum)
optimizer.use_cleargrads()
optimizer.setup(model)
optimizer.add_hook(chainer.optimizer.WeightDecay(weight_decay))

train, test = imageNet_data.train_val_test()
train_iter = iterators.SerialIterator(train, batch_size)
test_iter = iterators.SerialIterator(test, batch_size, repeat=False,shuffle=False)
with chainer.using_config('debug', True):
# Set up a trainer
    updater = training.StandardUpdater(train_iter, optimizer, loss_func=model, converter=convert)
    trainer = training.Trainer(updater, (10, 'epoch'), out="./backup/result")
    trainer.extend(print_obs, trigger=(3, 'iteration'))
    trainer.extend(extensions.LogReport())
    trainer.extend(extensions.PrintReport(
  ['epoch', 'main/loss', 'validation/main/loss',
   'main/accuracy', 'validation/main/accuracy', 'elapsed_time']))
trainer.run()

Может быть, это что-то полностью упущено, и это совершенно очевидно.. Спасибо за все замечания, которые мне очень помогли.

Цепник4.1, Ubuntu16


person Betty LD    schedule 26.06.2018    source источник
comment
Не могли бы вы описать ожидаемые/фактические результаты? Вы имеете в виду, что trainer.observation становится {}?   -  person kmaehashi    schedule 26.06.2018
comment
Кстати, вам нужно указать от device=0 до StandardUpdater, чтобы использовать GPU.   -  person kmaehashi    schedule 26.06.2018
comment
Да, я поставлю устройство = 0, спасибо. Мой реальный желаемый результат - это регрессия, которая работает, но проблема в том, что вывод расширения пуст. LogReport или PrintReport печатают только время и эпоху (цикл run() тогда работает хорошо). Итак, я проверил и обнаружил, что наблюдение = {} действительно на каждой итерации   -  person Betty LD    schedule 27.06.2018
comment
Я понимаю. Вы используете Classifier или свою собственную ссылку? В последнем случае вам необходимо сообщить об этом самостоятельно. См. github.com/chainer/chainer/blob. /v4.1.0/examples/imagenet/ и github.com/chainer/chainer/blob/v4.1.0/chainer/links/model/ . Было бы полезно, если бы вы предоставили минимальный исполняемый код для воспроизведения проблемы, чтобы я мог проверить ее для вас.   -  person kmaehashi    schedule 27.06.2018
comment
Извините за отсутствие кода, я не хотел, чтобы это было слишком грязно. Это точно ответ на мою проблему, теперь он работает. большое спасибо, я не нашел эти примеры раньше.   -  person Betty LD    schedule 27.06.2018


Ответы (1)


Если вы используете свою собственную ссылку с тренером, вам необходимо сообщать о показателях, используя chainer.report самостоятельно. См. https://docs.chainer.org/en/stable/guides/report.html для инструкций.

Вы можете увидеть несколько примеров в репозитории Chainer:

person kmaehashi    schedule 29.06.2018