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.
我试图对卷积层施加一些约束,但它似乎不起作用。
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.