在训练期间,Tensorflow 会跟踪模型中定义的所有 tf.Variable 对象。如果您将常量定义为tf.Variable,它将通过反向传播进行调整。
假设我们有一个数据集 wi X 和 y,即 y = X * 2:
import tensorflow as tf
x = tf.random.uniform((10_000, 1))
y = x * 2
我们将创建一个内部有一个常量的模型,它需要复制X 和y 之间的关系。我们当然会将这个值初始化为 2 以外的值。X 和 y 之间的关系是 2,所以训练应该使常数收敛到 2。所以让我们定义一个只是常数的模型。
class CustomModel(tf.keras.models.Model):
def __init__(self):
super(CustomModel, self).__init__()
self.constant = tf.Variable(initial_value=0.1, dtype=tf.float32, trainable=True)
def call(self, x, **kwargs):
x = self.constant * x
return x
model = CustomModel()
现在只需编译和训练模型:
model.compile(loss='mae')
history = model.fit(x, y, epochs=25, verbose=0)
现在看看权重。初始化为 0.1 的常量现在是 2。它已经过优化,因为它理解了 X 和 y 之间的关系,即 2。
model.weights
[<tf.Variable 'Variable:0' shape=() dtype=float32, numpy=2.0>]