Я пытаюсь перейти с Brainscript на c ++ для обучения модели в cntk и пытаюсь настроить различные параметры в блоке SGD в файле .cntk при использовании c ++. В частности, я не уверен, как установить:
maxSamplesInRAM
numSubminibatches
minLearningRatePerSample (is this even necessary as learning rate is per sample, not mb, in c++ I think???)
momentumPerMB
L2RegWeight
dropoutRate
Я также не совсем уверен, какой из MomentumSGDLearner или SGDLearner совпадает с тем, что происходит в Brainscript (я предполагаю последнее, поскольку вы можете указать импульс).
Пока я работаю с:
LearningRateSchedule learningRatePerSample = TrainingParameterPerSampleSchedule(5e-8);
CNTK::AdditionalLearningOptions learner_opts;
learner_opts.dictOptions.Add(std::wstring(L"dropoutRate"), std::wstring(L"1"));
learner_opts.dictOptions.Add(std::wstring(L"maxSamplesInRAM"), std::wstring(L"1"));
learner_opts.dictOptions.Add(std::wstring(L"numSubminibatches"), std::wstring(L"4"));
learner_opts.l2RegularizationWeight = 0;
learner_opts.l1RegularizationWeight = 0;
// Either
//auto trainer = CreateTrainer(classifierOutput, errLayer, errLayer, { SGDLearner(classifierOutput->Parameters(), learningRatePerSample,learner_opts) });
// Or
CNTK::MomentumSchedule momentumSchedule = CNTK::MomentumSchedule(0.01); // Opposite sense from in brainscript?? (0==off)
auto trainer = CreateTrainer(classifierOutput, errLayer, errLayer, { MomentumSGDLearner(classifierOutput->Parameters(), learningRatePerSample,momentumSchedule, DefaultUnitGainValue(), learner_opts) });
Таким образом, импульс, похоже, что-то делает, но имеет противоположный смысл branscript (0 = выключено, а не 1 ??). Мои эксперименты с CNTK :: AdditionalLearningOptions, кажется, не имеют никакого значения вообще. Я предполагаю, что Learner_opts.l2RegularizationWeight такой же, как L2RegWeight в Brainscript, но трудно сказать, если он что-то делает.
C ++ действительно может сделать с некоторой документацией!
Спасибо
Задача ещё не решена.
Других решений пока нет …