Я тренирую модель с 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
Я реализовал потери и метрики, которые мне нужны, с помощью простых операций. Теперь тренировка не замедляется (пока). Я все еще хотел бы знать, почему при простом вычислении необходимо добавить узлы в граф тензорного потока.