首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow 2- NumPy数值和数组会导致TF函数的新图形吗?

TensorFlow 2- NumPy数值和数组会导致TF函数的新图形吗?
EN

Stack Overflow用户
提问于 2021-05-01 07:55:02
回答 1查看 232关注 0票数 2

数值Python值”在手放在ML 2上中是否包括NumPy int、float和数组?我们是否需要从一个DataSet构造中显式地创建TF张量或TF NumPy作为TF函数的参数?

手放在ML 2上第12章自动图形和跟踪:

默认情况下,TF函数为每一组输入形状和数据类型生成一个新的图表,并将其缓存以供后续调用。..。然而,--这只适用于张量参数:如果将数值Python值传递给TF函数,将为每个不同的值生成一个新的图。..。 如果将数值Python值传递给TF函数,则将为每个不同的值生成一个新的图。如果使用不同的数值Python值多次调用TF函数,则会生成许多图形,从而减缓程序的速度,消耗大量RAM (必须删除TF函数才能释放它)。 Python值应该保留给几乎没有唯一值的参数,例如每层的神经元数量等超参数。这使得TensorFlow能够更好地优化yor模型的每个变体。

TensorFlow文档追踪规则中所述的第三条规则对应于Python、float、boolean、str等,这些规则将导致新的图形部分。但不确定第5条规则(所有其他Python类型)是否适用于NumPy结构。

函数通过从输入的args和kwargs计算缓存密钥来确定是否重用跟踪的ConcreteFunction。缓存键是一个键,它根据函数调用的输入args和kwargs,根据以下规则(可能会发生变化)来标识ConcreteFunction:

  1. 为tf.Tensor生成的键是它的形状和dtype。
  2. 为tf.Variable生成的键是唯一的变量id。
  3. 为Python原语(如int、float、str)生成的键是它的值。
  4. 为嵌套的dicts、lists、tuple、namedtuple和attrs生成的键是叶键的扁平元组(请参见nest.flatten)。(由于这种扁平化,调用具有与跟踪期间使用的嵌套结构不同的具体函数将导致TypeError)。
  5. 对于所有其他Python类型,键对于对象是唯一的。这样,对调用的每个实例都独立地跟踪一个函数或方法。

我认为函数存在的事实表明TF函数跟踪将生成一个新的图,但需要一个明确的确认。

EN

回答 1

Stack Overflow用户

发布于 2021-07-13 16:59:43

我认为改变numpy数组中的值不会生成一个新的图形。请考虑以下最起码的代码示例:

代码语言:javascript
复制
@tf.function 
def test(input): 
  print("Tracing with input= ", input)
  tf.print("Executing with input = ", input)

第一个打印只在跟踪期间执行,第二个对每个调用执行。用列表调用它会导致:

代码语言:javascript
复制
test([1,2])
test([3,4])
>>> Tracing with input =  [1, 2]
>>> Executing with input [1, 2]
>>> Tracing with input =  [3, 4]
>>> Executing with input [3, 4]

使用numpy-数组调用它会导致:

代码语言:javascript
复制
test(np.array([1,2]))
test(np.array([3,4]))
>>> Tracing with input =  Tensor("input:0", shape=(2,), dtype=int32)
>>> Executing with input [1 2]
>>> Executing with input [3, 4]

这里不对第二个调用执行跟踪。这至少表明numpy数组的处理方式与tensorflow张量相同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67344068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档