Tensorflow clip_by_value 与 Keras NonNeg

问题描述

我想通过约束关键字参数将 Tensorflow Variable 约束为非负值。我应该使用来自基础 tensorflow 的 clip_by_value 还是来自 Keras 的 NonNeg?这是我对 clip_by_value 约束的实现:

def make_nonneg(x):
    return clip_by_value(x,0.0,np.inf)

此外,如果我最终在 @tf.function 调用中包装的代码中使用变量,这两种方法是否同样有效?

解决方法

这是一个品味问题,取决于您使用它的方式。如果您使用 Keras 层定义模型并希望在训练期间放置约束,则使用 Keras 约束非常方便:

model.add(Dense(64,kernel_constraint=NonNeg()))

但它的有效作用与 clip_by_value 非常相似:

  def __call__(self,w):
    return w * math_ops.cast(math_ops.greater_equal(w,0.),K.floatx())

https://github.com/tensorflow/tensorflow/blob/v2.4.1/tensorflow/python/keras/constraints.py#L93

因此,NonNeg 约束只是一个可调用的对象包装器。