c++ - tensorflow c++ API 是否支持反向传播的自动微分?
问题描述
张量流 C++ API 是否支持自动微分以反向传播梯度?
如果我用 c++ 编写一个图形并想在 c++ 代码中运行它(而不是在 python 中!)自动微分会起作用吗?
让我们假设图中的每个操作都有一个梯度实现。
我认为关于张量流 C++ API 可以做什么和不能做什么的文档非常差。
非常感谢你的帮助
解决方案
从技术上讲它可以,但是AFAIK自动区分仅在Python中“配置”。我的意思是,在较低级别上,每个 TensorFlow 操作都不会声明自己的梯度是什么(即计算其梯度的相应操作)。而是在 Python 级别声明。例如,您可以查看math_ops.py
. 您会看到,除其他外,有几个函数用@ops.RegisterGradient(...)
. 这个装饰器所做的是将该函数添加到操作及其梯度的全局注册表(在 Python 中)。因此,例如,优化器类主要在 Python 中实现,因为它们利用此注册表来构建反向传播计算(而不是为此使用本机 TensorFlow 原语,后者不存在)。
所以关键是您可以使用相同的操作(然后使用相同的内核实现)进行相同的计算,但我认为 C++ 没有(或将永远拥有)这样的梯度注册表(和优化器类),因此您需要自己制定或复制该反向传播结构。通常,C++ API 不太适合构建计算图。
现在一个不同的问题(也许这就是你首先要问的问题)是你是否可以运行一个已经存在的在 C++ 中进行反向传播的图。我的意思是在 Python 中构建一个计算图,创建一个优化器(进而在图中创建必要的操作来计算梯度和更新变量)并导出图,然后在 C++ 中加载该图并运行它。这是完全可能的,与在 TensorFlow C++ 中运行任何其他类型的东西没有什么不同。
推荐阅读
- sql - SQL Server:将行插入表中,所有 id 尚不存在
- angular - 传递正确的上下文以在 Angular 的对话框数据中运行
- r - With two groups in dplyr output I want second group to be in descending order
- android-studio - Kotlin Scratch File Android Studio readline()
- javascript - npx 创建反应应用程序
在某个部分后停止运行 - mysql - Strange problem with double in database mysql
- angular - Angular 8 cannot match nested route
- text-editor - 创建文本程序
- javascript - 查找元素的 XPath
- html - 如何对齐这些项目?