问题描述
我想通过约束关键字参数将 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
约束只是一个可调用的对象包装器。