如果我在构建图形时涉及 for 循环,tensorflow 中的 autodiff 是否有效?
Does autodiff in tensorflow work if I have a for loop involved in constructing my graph?
我有一种情况,我有一批图像,在每张图像中,我必须对该图像中的一个小补丁执行一些操作。现在的问题是批处理中每个图像的补丁大小是可变的。所以这意味着我无法对其进行矢量化。我可以通过考虑图像中的整个像素范围来进行矢量化,但我的每个图像的补丁大小实际上是一小部分,我不想通过执行操作并存储每个图像中所有像素的结果来浪费我的内存.
所以简而言之,我需要使用循环。现在我看到 tensorflow 只定义了一个 while 循环,没有 for 循环。所以我的问题是,如果我使用普通的 python 样式循环对我的张量执行操作,autodiff 是否会无法计算我的图中的梯度?
Tensorflow 不知道(因此不关心)图是如何构建的,只要使用适当的函数,您甚至可以手动编写每个节点。所以特别是 for 循环与 TF 无关。另一方面,TF while 循环使您能够在图形内部表达动态计算,因此如果您想按顺序处理数据并且只需要内存中的当前数据 - 只有 while 循环可以实现这一点。如果您手动(通过循环)创建一个巨大的图形,它将始终被执行,并且所有内容都存储在内存中。只要这适合您的机器,您应该没问题。另一件事是动态长度,如果有时你需要 运行 循环 10 次,有时需要 1000 次,你必须使用 tf.while_loop,你不能用 for 循环来做到这一点(除非你为每个可能的长度)。
我有一种情况,我有一批图像,在每张图像中,我必须对该图像中的一个小补丁执行一些操作。现在的问题是批处理中每个图像的补丁大小是可变的。所以这意味着我无法对其进行矢量化。我可以通过考虑图像中的整个像素范围来进行矢量化,但我的每个图像的补丁大小实际上是一小部分,我不想通过执行操作并存储每个图像中所有像素的结果来浪费我的内存.
所以简而言之,我需要使用循环。现在我看到 tensorflow 只定义了一个 while 循环,没有 for 循环。所以我的问题是,如果我使用普通的 python 样式循环对我的张量执行操作,autodiff 是否会无法计算我的图中的梯度?
Tensorflow 不知道(因此不关心)图是如何构建的,只要使用适当的函数,您甚至可以手动编写每个节点。所以特别是 for 循环与 TF 无关。另一方面,TF while 循环使您能够在图形内部表达动态计算,因此如果您想按顺序处理数据并且只需要内存中的当前数据 - 只有 while 循环可以实现这一点。如果您手动(通过循环)创建一个巨大的图形,它将始终被执行,并且所有内容都存储在内存中。只要这适合您的机器,您应该没问题。另一件事是动态长度,如果有时你需要 运行 循环 10 次,有时需要 1000 次,你必须使用 tf.while_loop,你不能用 for 循环来做到这一点(除非你为每个可能的长度)。