Я пытаюсь восстановить C ++ API для CNTK (так как нет официальной документации) из CNTKLibrary.h
Я создал сеть RNN (в основном, следуя исходным кодам модульных тестов), и она работает (по крайней мере, пока нет ошибок компиляции или времени выполнения !!!)
В исходном коде модульного теста я вижу, что они использовали Function :: Forward и Function :: Backward для вычисления «trainingLoss» и «prection», но также, следуя примерам Python, я обнаружил, что могу создать «Trainer» со связанным оптимизатором ученика (FSAdaFradLearner) , а затем позвоните «TrainMinibatch» на этот poinetr.
Теперь мой вопрос: какой способ обучения модели является правильным?
Существуют разные уровни абстракции для достижения одного и того же.
Trainer
является классом оболочки / удобства, который запоминает несколько вещей для вас, таких как корневой узел и ученик, и предоставляет функцию удобства TrainMinibatch()
, которая фактически является последовательностью Forward()
, Backward()
, а также learner.Update()
,
API C ++ очень похож на API Python. Фактически, большинство функций и классов Python API являются просто обертками вокруг соответствующих функций и классов C ++. Таким образом, хотя сигнатуры методов не совпадают на 100% из-за различий в языке и системе типов, любая логика, описанная в документации по Python, должна применяться непосредственно к C ++.
В типичных случаях использования вызова TrainMinibatch()
в конечном итоге здесь: [https://github.com/Microsoft/CNTK/blob/94e6582d2f63ce3bb048b9da01679abeacda877f/Source/CNTKv2LibraryDll/Trainer.cpp#L193
Это вызывает ExecuteForwardBackward()
, который вызывает Forward()
а также Backward()
, Вы можете использовать это как пример того, как вызывать эти функции.
Других решений пока нет …