Python 为什么TensorFlow使用'None'作为默认激活?

Python 为什么TensorFlow使用'None'作为默认激活?,python,tensorflow,default,Python,Tensorflow,Default,在TensorFlow Python API中,tf.layers.dense的激活kwarg的默认值为None,然后在文档中说明: 激活:要使用的激活功能。如果您没有指定任何内容,则不会应用任何激活(即“线性”激活:a(x)=x) 为什么不在定义函数时使用identity函数作为默认值呢?像这样: def dense(..., activation=lambda x: x, ...): pass 这样,您就不必担心文档和代码之间的不一致性 这(使用None表示默认函数)只是一种编码风

在TensorFlow Python API中,
tf.layers.dense
激活
kwarg的默认值为
None
,然后在文档中说明:

激活:要使用的激活功能。如果您没有指定任何内容,则不会应用任何激活(即“线性”激活:a(x)=x)

为什么不在定义函数时使用identity函数作为默认值呢?像这样:

def dense(..., activation=lambda x: x, ...):
    pass
这样,您就不必担心文档和代码之间的不一致性

这(使用None表示默认函数)只是一种编码风格,还是将函数用作kw参数的默认值有一些警告

它不是为了避免不必要的函数调用,因为即使
None
被传递到
activation
,标识函数仍然会被创建和调用。此外,由于这种情况发生在图形构建时,所以没有必要进行这样的优化——假设这确实是一种优化

更正:


正如@y-luo所指出的,
tf
实现实际上并没有创建标识函数。但是
tf.keras
实现确实如此。

我认为实际上没有身份函数或任何函数。用于:


正如您所看到的,
None
激活实际上是正确的,因为它是一种条件,而不是真正的函数。它只相当于“线性”激活:
a(x)=x

tf.keras版本。只是看不到使用
None
@Incömplete的好处,你是对的。凯拉斯在这里做的事情不同。他们可能会按照你的建议更新论点,并反映实际情况。我不知道它有多大的好处,但你不必再对tf和None进行一次函数调用。更重要的是,当我在tensorflow中为完全连接的网络设置“activation\u fn=None”时。它给了我一个带有
biasad
的tensorclass对象。为什么会这样?通常的做法是使用
None
作为默认参数,并在函数体中使用类似
的内容(如果activation为None:activation=…
)。在定义函数时(不是每次调用函数时)会计算默认参数,因此所有函数调用都会获得相同的默认参数实例。这会导致在使用可变对象(例如列表)时出现意外行为。对于
lambda
参数,它可能是不必要的,但它仍然是一种良好的做法。@pschill我认为即使默认值是一个复杂的函数,并且不是由lambda定义的,它仍然可以用作默认值-除非您以后想为该函数名指定另一个函数,由于没有额外的参数被传递给
激活
标识的函数,该函数只能接受一个参数,因此我们不必担心
激活
标识的函数中的可变参数,因此无论您“在未遇到时调用它”或“使用它作为默认值然后调用它”,它们总是指同一个函数。。。。。。即使该函数中有后期绑定变量,它们仍然会给出相同的结果。但这可能太多了,最好使用
None
并忘掉它。谢谢:)
class Dense(base.Layer):

  ...

  def call(self, inputs):
    ...
    if self.activation is not None:
      return self.activation(outputs)  # pylint: disable=not-callable
    return outputs