Мне нужно создать собственный обратный вызов, чтобы получить целевые значения, т. Е. Y_true и y_pred (прогнозируемые значения).Итак, я прочитал пост: Создание обратного вызова keras для сохранения прогнозов моделей и целей для каждого пакета во время обучения
И создал мой обратный вызов так же, как они создали в ответе
from keras.callbacks import Callback
from keras import backend as K
import tensorflow as tf
class CollectOutputAndTarget(Callback):
def __init__(self):
super(CollectOutputAndTarget, self).__init__()
self.targets = [] # collect y_true batches
self.outputs = [] # collect y_pred batches
# the shape of these 2 variables will change according to batch shape
# to handle the "last batch", specify `validate_shape=False`
self.var_y_true = tf.Variable(0., validate_shape=False)
self.var_y_pred = tf.Variable(0., validate_shape=False)
def on_batch_end(self, batch, logs=None):
# evaluate the variables and save them into lists
self.targets.append(K.eval(self.var_y_true))
self.outputs.append(K.eval(self.var_y_pred))
# build a simple model
# have to compile first for model.targets and model.outputs to be prepared
model = Sequential([Dense(5, input_shape=(10,))])
model.compile(loss='mse', optimizer='adam')
# initialize the variables and the `tf.assign` ops
cbk = CollectOutputAndTarget()
fetches = [tf.assign(cbk.var_y_true, model.targets[0], validate_shape=False),
tf.assign(cbk.var_y_pred, model.outputs[0], validate_shape=False)]
model._function_kwargs = {'fetches': fetches} # use `model._function_kwargs` if using `Model` instead of `Sequential`
Когда я добавляю on_epoch_end
и пытаюсь напечатать значение self.targets
.Я получаю массивы 0s.Для on_epoch_end
код выглядит следующим образом:
def on_epoch_end(self, epoch, logs={}):
print(self.targets)
Моя модель создана с использованием функционального API Model
и в нее загружены предварительно обученные веса вместо последовательных.И после компиляции модели как model.compile
я создаю экземпляр callback
, создаю объект fetches
и добавляю его к train_function
следующим образом:
cbk = CollectOutputAndTarget()
fetches = [tf.assign(cbk.var_y_true, model.targets[0], validate_shape=False),
tf.assign(cbk.var_y_pred, model.outputs[0], validate_shape=False)]
model._function_kwargs = {'fetches': fetches}
И затем я вызываю model.fit_generator
используя мой генератор данных.Я получаю 0s
в self.targets
, что не должно происходить, если var_y_true
и var_y_pred
обновляются с model.targets
и model.outputs
.Кроме того, я не понимаю, что если мы уже присваиваем значения для cbk.var_y_true
и cbk.var_y_pred
, то почему мы должны использовать model._function_kwargs
?
Я попытался использовать model.train_function = None
после настройкиfetches
и перед вызовом fit_generator
, но все равно я получаю тот же результат.