2 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
當(dāng)我首先初始化模型并將其作為額外參數(shù)添加到回調(diào)方法時(shí),它會(huì)起作用。所以解決辦法如下:
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])

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊
避免直接編輯變量。您必須像這樣訪問 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])
請(qǐng)注意我如何獲取當(dāng)前值,例如val = keras.backend.get_value(model.optimizer.lr)。這是在運(yùn)行時(shí)獲取正確值的正確方法。另外,不要在循環(huán)內(nèi)使用或聲明新變量。您可能可以new_value通過閱讀和更改舊的內(nèi)容來獲得新的內(nèi)容。另外,請(qǐng)避免在回調(diào)內(nèi)部使用除 Tensorflow 之外的任何其他庫(kù),尤其是當(dāng)您的回調(diào)經(jīng)常被調(diào)用時(shí)。不要使用numpy,使用tensorflow。實(shí)際上總有一種張量流操作可以滿足您的需要。
編輯:如果您有一些自定義值要更新,您可以使用如下模式:
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 回調(diào)。
從回調(diào)中,您可以訪問模型的任何變量。像這樣self.model.someVariable。您還可以訪問模型自定義__init__函數(shù)中定義的任何自定義變量,如下所示:
#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)
...
請(qǐng)注意,您不能self.model在回調(diào)__init____init__函數(shù)中使用,因?yàn)檎{(diào)用回調(diào)時(shí)模型仍未初始化。
這有幫助嗎?
添加回答
舉報(bào)