tensorflow c ++ API是否支持自动差异化以进行反向传播?

时间:2018-06-28 08:58:45

标签: c++ tensorflow backpropagation gradient-descent

张量流C ++ API是否支持自动微分以反向传播梯度?
如果我用C ++编写图形并想用C ++代码(而不是python!)运行它,自动微分会起作用吗?

让我们假设图中的每个操作都有一个梯度实现。

我认为关于张量流C ++ API可以做什么和不能做什么的文档非常少。

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

技术上可以,但是AFAIK的自动区分仅在Python中“配置”。我的意思是,在较低级别上,每个TensorFlow操作都不会声明自己的梯度(即,计算其梯度的相应操作)。而是在Python级别上声明。例如,您可以查看math_ops.py。您将看到,除其他外,有几个用@ops.RegisterGradient(...)装饰的功能。这个装饰器所做的是将该功能添加到操作及其渐变的全局注册表中(在Python中)。因此,例如,优化器类主要在Python中实现,因为它们利用此注册表来构建反向传播计算(与之相对的,为此目的,则不使用原生TensorFlow原语,该原语不存在)。

因此,关键是您可以使用相同的操作(然后使用相同的内核实现)进行相同的计算,但是我不认为C ++具有(或将永远具有)这样的渐变注册表(和优化器)类),因此您需要自己计算或复制该反向传播构造。通常,C ++ API不太适合构建计算图。

现在有一个不同的问题(也许这就是您首先要问的问题):您是否可以运行已经存在的图形,并在C ++中进行反向传播。我的意思是用Python构建一个计算图,创建一个优化器(该优化器又在图中创建必要的操作以计算梯度并更新变量)并导出图,然后在C ++中加载该图并运行它。这完全有可能,并且与在TensorFlow C ++中运行任何其他类型的事物没有什么不同。