Метрики Keras в обратном вызове добавляют к тензорному графу - PullRequest
0 голосов
/ 18 мая 2019

Я тренирую модель с Keras и определил обратный вызов, где я вычисляю некоторые метрики после каждой эпохи. Я использую функции из keras.metrics, как mean_absolute_error. Мой обратный вызов выглядит так:

class CalcMae(Callback): 

    def __init__(self):
        placeholder = np.zeros((batch_size, 1))
        self.val_y_true = K.variable(placeholder, name='val_y_true')
        self.val_y_pred = K.variable(placeholder, name='val_y_pred')

    def on_epoch_end(self, epoch, logs={}):
        # get some values for y_true and y_pred
        K.set_value(self.val_y_true, local_val_y_true)
        K.set_value(self.val_y_pred, local_val_y_pred)

        val_mea = K.eval(keras.metrics.mean_absolute_error(self.val_y_true, self.val_y_pred)))

Теперь каждое обучение эпохи идет немного медленнее, я играл с тензорной доской и выяснил, что вызов mean_absolute_error добавляет узлы к графику тензорного потока. Я предполагаю, что график увеличивается с каждой эпохой, что приводит к замедлению эпох.

Мой вопрос таков: почему при вызове mean_absolute_error (или другой метрики / потери) узлы добавляются в граф тензорного потока, когда он просто вычисляет значение? И лучше ли для этого определить мои собственные метрические функции?

(я не могу использовать метрики из самого Keras, потому что мне нужны дополнительные данные, которые недоступны в метрической функции)

* Редактировать 1013 ** * 1014 Я реализовал потери и метрики, которые мне нужны, с помощью простых операций. Теперь тренировка не замедляется (пока). Я все еще хотел бы знать, почему при простом вычислении необходимо добавить узлы в граф тензорного потока.

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