我试图从每个时代开始时的回调中修改不可训练的模型变量。本质上,我希望有一种类似于学习率调度程序(在 TF 中内置基础设施)但适用于任意模型变量的机制。下面的代码是展示该概念的最小示例。我正在尝试修改衰减变量,但它不起作用。显然,变量 (1.0) 的初始值被视为常量并被图形折叠,并且在训练进行时不再查看,即使该变量似乎被回调正确修改(至 0.5)。
dense1 = tf.keras.layers.Dense(10)
decay = tf.Variable(1.0, trainable=False)
dense2 = tf.keras.layers.Dense(10)
def epoch_callback(epoch):
nonlocal decay
tf.keras.backend.set_value(decay, 0.5)
#decay.assign(0.5)
print(tf.keras.backend.get_value(decay))
input = tf.keras.layers.Input((MAX_LENGTH,))
x = dense1(input)
with tf.control_dependencies([decay]):
x = x * decay
prediction = dense2(x)
model = tf.keras.Model(inputs=[input], outputs=[prediction])
model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))
callbacks = [tf.keras.callbacks.LambdaCallback(on_epoch_begin = lambda epoch, logs: epoch_callback(epoch))]
model.fit(train_ds, epochs=EPOCHS, verbose=1, callbacks=callbacks, validation_data=eval_ds)
Run Code Online (Sandbox Code Playgroud)
@nbro:给你。下面的代码对我有用。我使用教师强制协议,并且随着训练的进行,每个时期的衰减变量用于“降低教师的声音”。
class Teacher(tf.keras.layers.Layer):
def __init__(self, embedding, name='teacher', **kwargs):
super().__init__(name=name, **kwargs)
...
def build(self, input_shape):
...
def call(self, inputs, training=None): …Run Code Online (Sandbox Code Playgroud)