2 回答
![?](http://img1.sycdn.imooc.com/533e4d2600013fe202000200-100-100.jpg)
TA贡献1797条经验 获得超6个赞
当我首先初始化模型并将其作为额外参数添加到回调方法时,它会起作用。所以解决办法如下:
class LossCallback(tf.keras.callbacks.Callback):
def __init__(self, model):
super(LossCallback, self).__init__()
model.beta_x = tf.Variable(1.0, trainable=False, name='weight1', dtype=tf.float32)
def on_epoch_begin(self, epoch, logs=None):
tf.keras.backend.set_value(self.model.beta_x, tf.constant(0.5) * epoch)
def on_epoch_end(self, epoch, logs=None):
logs = logs or {}
logs['beta_x'] = tf.keras.backend.get_value(self.model.beta_x)
model = create_model() # initialize custom keras model
callback = LossCallback(model)
model.fit(..., callbacks=[callback])
![?](http://img1.sycdn.imooc.com/5333a1bc00014e8302000200-100-100.jpg)
TA贡献1876条经验 获得超7个赞
避免直接编辑变量。您必须像这样访问 keras 变量
import tensorflow as tf
from tensorflow import keras
import numpy as np
def warm_up(epoch, logs):
val = keras.backend.get_value(model.optimizer.lr)
val *= 1.1
tf.keras.backend.set_value(model.optimizer.lr, val)
callback = tf.keras.callbacks.LambdaCallback(on_epoch_begin=warm_up)
model = tf.keras.models.Sequential([
keras.layers.Dense(10, 'relu'),
keras.layers.Dense(1, 'sigmoid')
])
model.compile(loss='binary_crossentropy')
X_train = tf.random.uniform((10,10))
y_train = tf.ones((10,))
model.fit(X_train, y_train,
callbacks = [callback])
请注意我如何获取当前值,例如val = keras.backend.get_value(model.optimizer.lr)。这是在运行时获取正确值的正确方法。另外,不要在循环内使用或声明新变量。您可能可以new_value通过阅读和更改旧的内容来获得新的内容。另外,请避免在回调内部使用除 Tensorflow 之外的任何其他库,尤其是当您的回调经常被调用时。不要使用numpy,使用tensorflow。实际上总有一种张量流操作可以满足您的需要。
编辑:如果您有一些自定义值要更新,您可以使用如下模式:
class LossCallback(tf.keras.callbacks.Callback):
def __init__(self):
super(LossCallback, self).__init__()
self.someValue = tf.Variable(1.0, trainable=False, name='weight1', dtype=tf.float32)
def on_epoch_end(self, epoch, logs=None):
tf.keras.backend.set_value(self.model.loss.someValue, self.someValue * epoch)
或者您仍然可以尝试使用 lambda 回调。
从回调中,您可以访问模型的任何变量。像这样self.model.someVariable。您还可以访问模型自定义__init__函数中定义的任何自定义变量,如下所示:
#in model's custom __init__
def __init__(self, someArgs):
...
self.someArg = someArgs
...
#in callback's "on_epoch_..." method
...
keras.backend.set_value(self.model.someArg, 42)
...
请注意,您不能self.model在回调__init____init__函数中使用,因为调用回调时模型仍未初始化。
这有帮助吗?
添加回答
举报