Tensorflow clip_by_值与Keras NonNeg

Tensorflow clip_by_值与Keras NonNeg,tensorflow,keras,constraints,Tensorflow,Keras,Constraints,我想通过constraint关键字参数将Tensorflow约束为非负。我应该使用base tensorflow还是Keras?以下是我对clip_by_值约束的实现: def make_nonneg(x): return clip_by_value(x,0.0,np.inf) 另外,如果我最终使用@tf.function调用中包装的代码中的变量,这两种方法是否同样有效?这是一个品味问题,取决于您使用它的方式。如果使用Keras图层定义模型并希望在培训期间放置约束,则使用Keras约束

我想通过constraint关键字参数将Tensorflow约束为非负。我应该使用base tensorflow还是Keras?以下是我对clip_by_值约束的实现:

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

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

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

model.add(Dense(64, kernel_constraint=NonNeg()))
但它的有效功能与
按值剪裁非常相似:

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


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

感谢您的回复。我感到奇怪的是,keras约束有时会产生(-0.0)值,而clip_by_值约束总是有0.0。出于这个原因,我目前使用clip_by_值,因为从数值上来说,-0.0实际上可能是负数。我想我总是可以加一个小常数来防止这种情况。