tf.assign не обновляет значение tf.Variable в пользовательском конструкторе инициализации обратного вызова с использованием model._function_kwargs - PullRequest
0 голосов
/ 26 июня 2019

Мне нужно создать собственный обратный вызов, чтобы получить целевые значения, т. Е. 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, но все равно я получаю тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...