Tensorflow 2.0:kernel_constraint 不工作

Tensorflow 2.0: kernel_constraint not working

我试图对卷积层施加一些约束,但它似乎不起作用。

import tensorflow as tf
import numpy as np
c2 = tf.keras.layers.Conv2D(filters=1, kernel_size=3, strides=(1, 1),
                            kernel_initializer=tf.keras.initializers.constant(-20.),
                            kernel_constraint=tf.keras.constraints.non_neg(), padding='valid')
x = np.reshape([1. for i in range(9)], (1, 3, 3, 1))
y = c2(x)
print(y)

我希望答案是 0,但它却给了我

tf.Tensor([[[[-180.]]]], shape=(1, 1, 1, 1), dtype=float32)

忽略 kernel_constraint 函数。

我是不是遗漏了什么或者是错误?顺便说一句,我使用 Windows 作为平台

归结为在首次构建 Layer 对象时是初始化程序优先还是约束优先。似乎在这种情况下,初始化程序优先。考虑到 Keras 约束文档中的内容,这是有道理的:

"Functions from the constraints module allow setting constraints (eg. non-negativity) on network parameters during optimization."

(参考:https://keras.io/constraints/)。

关键字词组是"during optimization"。对于您的代码示例,不涉及优化(即不进行培训或 fit())调用。可以稍微修改您的代码以表明约束确实有效:

import tensorflow as tf
import numpy as np

c2 = tf.keras.layers.Conv2D(filters=1, kernel_size=3, strides=(1, 1),
                            kernel_initializer=tf.keras.initializers.constant(-20.),
                            kernel_constraint=tf.keras.constraints.non_neg(), padding='valid')

x = tf.constant(np.reshape([1. for i in range(9)], (1, 3, 3, 1)))

optimizer = tf.optimizers.SGD(0.01)
with tf.GradientTape() as tape:
  y = c2(x)
  print(y)
  gradients = tape.gradient(y, c2.variables)
  optimizer.apply_gradients(zip(gradients, c2.variables))

print(c2.get_weights())  # <-- See that the weights are all 0s now.