我正在尝试从CNTKLibrary.h逆向工程CNTK的C ++ API(因为没有官方文档)
我建立了一个RNN网络(主要通过遵循单元测试源代码)并且它似乎正常工作(至少现在没有编译或运行时错误!!!)
在单元测试源代码中,我看到他们使用Function :: Forward和Function :: Backward来计算“trainingLoss”和“predection”,但是通过以下Python实例,我发现我可以使用相关学习器优化器制作“Trainer” (FSAdaFradLearner),然后在该poinetr上调用“TrainMinibatch”。
现在我的问题是,哪一个是训练模型的正确方法?
答案 0 :(得分:2)
有不同的抽象级别来实现同样的目标。
Trainer
是一个包装/便利类,可以为你记住一些事情,比如根节点和学习者,并提供方便函数TrainMinibatch()
,它实际上是{{Forward()
的序列。 1}},Backward()
和learner.Update()
。
C ++ API与Python API非常相似。实际上,大多数Python API函数和类只是围绕相应C ++函数和类的包装器。因此,由于语言和类型 - 系统差异,方法签名不匹配100%,因此Python文档中描述的任何逻辑都应直接应用于C ++。
在典型的使用案例中,调用TrainMinibatch()
将在此处结束:[https://github.com/Microsoft/CNTK/blob/94e6582d2f63ce3bb048b9da01679abeacda877f/Source/CNTKv2LibraryDll/Trainer.cpp#L193
调用ExecuteForwardBackward()
,调用Forward()
和Backward()
。您可以将其用作如何调用这些函数的示例。